From 04a407d9a638b00c9eeb943457cdaf37b60400e1 Mon Sep 17 00:00:00 2001 From: Eli Belash Date: Sat, 14 Feb 2026 12:17:54 +0200 Subject: [PATCH 01/15] fix: np.matmul broadcasting crash with >2D arrays Fixed ArgumentOutOfRangeException when performing matrix multiplication on arrays with more than 2 dimensions (e.g., (3,1,2,2) @ (3,2,2)). Root causes: 1. Default.MatMul.cs: Loop count used `l.size` (total elements) instead of `iterShape.size` (number of matrix pairs to multiply) 2. UnmanagedStorage.Getters.cs: When indexing into broadcast arrays: - sliceSize incorrectly used parent's BufferSize for non-broadcast subshapes instead of the subshape's actual size - Shape offset was double-counted (once in GetSubshape, again because InternalArray.Slice already positioned at offset) The fix ensures: - Correct iteration count over batch dimensions - Proper sliceSize calculation based on subshape broadcast status - Shape offset reset to 0 after array slicing Verified against NumPy 2.4.2 output. --- .../Default/Math/BLAS/Default.MatMul.cs | 3 +-- .../Unmanaged/UnmanagedStorage.Getters.cs | 22 ++++++++++++++----- .../LinearAlgebra/np.matmul.Test.cs | 2 -- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/NumSharp.Core/Backends/Default/Math/BLAS/Default.MatMul.cs b/src/NumSharp.Core/Backends/Default/Math/BLAS/Default.MatMul.cs index dfb8e1cb..fba8cfbf 100644 --- a/src/NumSharp.Core/Backends/Default/Math/BLAS/Default.MatMul.cs +++ b/src/NumSharp.Core/Backends/Default/Math/BLAS/Default.MatMul.cs @@ -30,11 +30,10 @@ public override NDArray Matmul(NDArray lhs, NDArray rhs) NDArray r = rhs; (l, r) = np.broadcast_arrays(l, r); var retShape = l.Shape.Clean(); - Console.WriteLine(retShape); Debug.Assert(l.shape[0] == r.shape[0]); - var len = l.size; var ret = new NDArray(np._FindCommonArrayType(l.typecode, r.typecode), retShape); var iterShape = new Shape(retShape.dimensions.Take(retShape.dimensions.Length - 2).ToArray()); + var len = iterShape.size; var incr = new ValueCoordinatesIncrementor(ref iterShape); var index = incr.Index; diff --git a/src/NumSharp.Core/Backends/Unmanaged/UnmanagedStorage.Getters.cs b/src/NumSharp.Core/Backends/Unmanaged/UnmanagedStorage.Getters.cs index e5ee978d..91fafb48 100644 --- a/src/NumSharp.Core/Backends/Unmanaged/UnmanagedStorage.Getters.cs +++ b/src/NumSharp.Core/Backends/Unmanaged/UnmanagedStorage.Getters.cs @@ -121,9 +121,14 @@ public UnmanagedStorage GetData(params int[] indices) if (this_shape.IsBroadcasted) { var (shape, offset) = this_shape.GetSubshape(indices); - // NumPy-aligned: use bufferSize instead of BroadcastInfo.OriginalShape.size - int sliceSize = shape.BufferSize > 0 ? shape.BufferSize : shape.size; - var view = UnmanagedStorage.CreateBroadcastedUnsafe(InternalArray.Slice(offset, sliceSize), shape); + // For non-broadcasted contiguous subshapes, use size (the actual data extent). + // Only use BufferSize when the subshape itself is broadcasted. + int sliceSize = shape.IsBroadcasted + ? (shape.BufferSize > 0 ? shape.BufferSize : shape.size) + : shape.size; + // Create shape with offset=0 since InternalArray.Slice already accounts for the offset + var adjustedShape = new Shape(shape.dimensions, shape.strides, 0, sliceSize); + var view = UnmanagedStorage.CreateBroadcastedUnsafe(InternalArray.Slice(offset, sliceSize), adjustedShape); view._baseStorage = _baseStorage ?? this; return view; } @@ -183,9 +188,14 @@ public unsafe UnmanagedStorage GetData(int* dims, int ndims) if (this_shape.IsBroadcasted) { var (shape, offset) = this_shape.GetSubshape(dims, ndims); - // NumPy-aligned: use bufferSize instead of BroadcastInfo.OriginalShape.size - int sliceSize = shape.BufferSize > 0 ? shape.BufferSize : shape.size; - var view = UnmanagedStorage.CreateBroadcastedUnsafe(InternalArray.Slice(offset, sliceSize), shape); + // For non-broadcasted contiguous subshapes, use size (the actual data extent). + // Only use BufferSize when the subshape itself is broadcasted. + int sliceSize = shape.IsBroadcasted + ? (shape.BufferSize > 0 ? shape.BufferSize : shape.size) + : shape.size; + // Create shape with offset=0 since InternalArray.Slice already accounts for the offset + var adjustedShape = new Shape(shape.dimensions, shape.strides, 0, sliceSize); + var view = UnmanagedStorage.CreateBroadcastedUnsafe(InternalArray.Slice(offset, sliceSize), adjustedShape); view._baseStorage = _baseStorage ?? this; return view; } diff --git a/test/NumSharp.UnitTest/LinearAlgebra/np.matmul.Test.cs b/test/NumSharp.UnitTest/LinearAlgebra/np.matmul.Test.cs index bb591747..10dee285 100644 --- a/test/NumSharp.UnitTest/LinearAlgebra/np.matmul.Test.cs +++ b/test/NumSharp.UnitTest/LinearAlgebra/np.matmul.Test.cs @@ -63,7 +63,6 @@ public void Case_3_2_2__3_2_2() } [Test] - [OpenBugs] // np.matmul crashes with ArgumentOutOfRangeException public void Case_3_1_2_2__3_2_2() { var a = np.full(2, (3, 1, 2, 2)); @@ -73,7 +72,6 @@ public void Case_3_1_2_2__3_2_2() } [Test] - [OpenBugs] // np.matmul crashes with ArgumentOutOfRangeException public void Case_3_1_2_2__3_2_2_Arange() { var a = np.arange(2 * 1 * 2 * 2).reshape((2, 1, 2, 2)); From a012c4f6cdb32b6c6a63b98e87e1968f3ebb3311 Mon Sep 17 00:00:00 2001 From: Eli Belash Date: Sat, 14 Feb 2026 12:38:27 +0200 Subject: [PATCH 02/15] fix(tests): correct IsBroadcasted expectations in broadcast_arrays tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The tests incorrectly expected both arrays to have IsBroadcasted=True after np.broadcast_arrays(). Per NumPy semantics, only arrays that actually get broadcasted (have stride=0 for dimensions with size>1) should be flagged. When broadcasting (1,1,1) with (1,10,1): - Array 'a' (1,1,1→1,10,1): IsBroadcasted=True (strides become 0) - Array 'b' (1,10,1→1,10,1): IsBroadcasted=False (no change, no zero strides) NumSharp's behavior was correct; the test expectations were wrong. --- test/NumSharp.UnitTest/Manipulation/NDArray.flat.Test.cs | 5 +++-- test/NumSharp.UnitTest/Selection/NDArray.Indexing.Test.cs | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/test/NumSharp.UnitTest/Manipulation/NDArray.flat.Test.cs b/test/NumSharp.UnitTest/Manipulation/NDArray.flat.Test.cs index 674c9c05..55241b5e 100644 --- a/test/NumSharp.UnitTest/Manipulation/NDArray.flat.Test.cs +++ b/test/NumSharp.UnitTest/Manipulation/NDArray.flat.Test.cs @@ -96,7 +96,6 @@ public void flat_scalar() } [Test] - [OpenBugs] // IsBroadcasted is False after broadcast_arrays public void flat_broadcasted_Case1() { var a = np.arange(4 * 1 * 1 * 1).reshape(4, 1, 1, 1)["3, :"]; @@ -104,8 +103,10 @@ public void flat_broadcasted_Case1() (a, b) = np.broadcast_arrays(a, b); + // Only 'a' is broadcasted (shape changed from (1,1,1) to (1,10,1) with stride=0) + // 'b' is NOT broadcasted - it was already (1,10,1), no strides changed to 0 a.Should().BeBroadcasted().And.BeShaped(1, 10, 1); - b.Should().BeBroadcasted().And.BeShaped(1, 10, 1); + b.Should().BeShaped(1, 10, 1); // b is NOT broadcasted per NumPy semantics a.flat.Should().BeShaped(10).And.AllValuesBe(3); b.flat.Should().BeShaped(10).And.BeOfValues(30, 31, 32, 33, 34, 35, 36, 37, 38, 39); } diff --git a/test/NumSharp.UnitTest/Selection/NDArray.Indexing.Test.cs b/test/NumSharp.UnitTest/Selection/NDArray.Indexing.Test.cs index ff5f5bdf..85250d14 100644 --- a/test/NumSharp.UnitTest/Selection/NDArray.Indexing.Test.cs +++ b/test/NumSharp.UnitTest/Selection/NDArray.Indexing.Test.cs @@ -995,7 +995,6 @@ public void Slice_MinusOne() } [Test] - [OpenBugs] // IsBroadcasted is False after broadcast_arrays public void Broadcasted_Case9_Sliced() { var a = np.arange(4 * 1 * 1 * 1).reshape(4, 1, 1, 1)["3, :"]; @@ -1003,8 +1002,10 @@ public void Broadcasted_Case9_Sliced() (a, b) = np.broadcast_arrays(a, b); + // Only 'a' is broadcasted (shape changed from (1,1,1) to (1,10,1) with stride=0) + // 'b' is NOT broadcasted - it was already (1,10,1), no strides changed to 0 a.Should().BeBroadcasted().And.BeShaped(1, 10, 1); - b.Should().BeBroadcasted().And.BeShaped(1, 10, 1); + b.Should().BeShaped(1, 10, 1); // b is NOT broadcasted per NumPy semantics a.Should().AllValuesBe(3); b.Should().BeOfValues(30, 31, 32, 33, 34, 35, 36, 37, 38, 39); } From b0b841ce11869a469d98a85a4c26ac6094434378 Mon Sep 17 00:00:00 2001 From: Eli Belash Date: Sat, 14 Feb 2026 12:44:48 +0200 Subject: [PATCH 03/15] fix: keepdims returns correct shape for element-wise reductions When np.sum() or np.mean() is called with keepdims=True and no axis specified (element-wise reduction), the result should preserve all dimensions as size 1. Before: np.sum(arr_2d, keepdims=True).shape = (1) After: np.sum(arr_2d, keepdims=True).shape = (1, 1) Fixed in both ReduceAdd and ReduceMean by reshaping to an array of 1s with the same number of dimensions as the input, instead of just calling ExpandDimension(0) once. Verified against NumPy 2.4.2 behavior. --- .../Math/Reduction/Default.Reduction.Add.cs | 17 +++++++++++++++-- .../Math/Reduction/Default.Reduction.Mean.cs | 16 ++++++++++++++-- .../Unmanaged/Math/Reduction/ReduceAddTests.cs | 1 - .../Statistics/NdArray.Mean.Test.cs | 1 - 4 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.Add.cs b/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.Add.cs index d48bd510..ccbc41d0 100644 --- a/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.Add.cs +++ b/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.Add.cs @@ -33,7 +33,13 @@ public override NDArray ReduceAdd(in NDArray arr, int? axis_, bool keepdims = fa } if (keepdims) - r.Storage.ExpandDimension(0); + { + // NumPy: keepdims preserves the number of dimensions, all set to 1 + var keepdimsShape = new int[arr.ndim]; + for (int i = 0; i < arr.ndim; i++) + keepdimsShape[i] = 1; + r.Storage.Reshape(new Shape(keepdimsShape)); + } else if (!r.Shape.IsScalar && r.Shape.size == 1 && r.ndim == 1) r.Storage.Reshape(Shape.Scalar); @@ -51,7 +57,14 @@ public override NDArray ReduceAdd(in NDArray arr, int? axis_, bool keepdims = fa var r = NDArray.Scalar(sum_elementwise(arr, typeCode)); if (keepdims) - r.Storage.ExpandDimension(0); + { + // NumPy: keepdims preserves the number of dimensions, all set to 1 + // e.g., sum of (3,2) with keepdims=True returns (1,1) + var keepdimsShape = new int[arr.ndim]; + for (int i = 0; i < arr.ndim; i++) + keepdimsShape[i] = 1; + r.Storage.Reshape(new Shape(keepdimsShape)); + } else if (!r.Shape.IsScalar && r.Shape.size == 1 && r.ndim == 1) r.Storage.Reshape(Shape.Scalar); diff --git a/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.Mean.cs b/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.Mean.cs index 89448352..38f26b00 100644 --- a/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.Mean.cs +++ b/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.Mean.cs @@ -19,7 +19,13 @@ public override NDArray ReduceMean(in NDArray arr, int? axis_, bool keepdims = f { var r = NDArray.Scalar(typeCode.HasValue ? Converts.ChangeType(arr.GetAtIndex(0), typeCode.Value) : arr.GetAtIndex(0)); if (keepdims) - r.Storage.ExpandDimension(0); + { + // NumPy: keepdims preserves the number of dimensions, all set to 1 + var keepdimsShape = new int[arr.ndim]; + for (int i = 0; i < arr.ndim; i++) + keepdimsShape[i] = 1; + r.Storage.Reshape(new Shape(keepdimsShape)); + } return r; } @@ -27,7 +33,13 @@ public override NDArray ReduceMean(in NDArray arr, int? axis_, bool keepdims = f { var r = NDArray.Scalar(mean_elementwise(arr, typeCode)); if (keepdims) - r.Storage.ExpandDimension(0); + { + // NumPy: keepdims preserves the number of dimensions, all set to 1 + var keepdimsShape = new int[arr.ndim]; + for (int i = 0; i < arr.ndim; i++) + keepdimsShape[i] = 1; + r.Storage.Reshape(new Shape(keepdimsShape)); + } else if (!r.Shape.IsScalar && r.Shape.size == 1 && r.ndim == 1) r.Storage.Reshape(Shape.Scalar); return r; diff --git a/test/NumSharp.UnitTest/Backends/Unmanaged/Math/Reduction/ReduceAddTests.cs b/test/NumSharp.UnitTest/Backends/Unmanaged/Math/Reduction/ReduceAddTests.cs index 862f63e7..8d669bf4 100644 --- a/test/NumSharp.UnitTest/Backends/Unmanaged/Math/Reduction/ReduceAddTests.cs +++ b/test/NumSharp.UnitTest/Backends/Unmanaged/Math/Reduction/ReduceAddTests.cs @@ -16,7 +16,6 @@ public void EmptyArray() } [Test] - [OpenBugs] // keepdims returns wrong shape (1) instead of (1,1) public void Case1_Elementwise_keepdims() { var np1 = np.array(new double[] {1, 2, 3, 4, 5, 6}).reshape(3, 2); diff --git a/test/NumSharp.UnitTest/Statistics/NdArray.Mean.Test.cs b/test/NumSharp.UnitTest/Statistics/NdArray.Mean.Test.cs index 4e44a6ec..c76afe27 100644 --- a/test/NumSharp.UnitTest/Statistics/NdArray.Mean.Test.cs +++ b/test/NumSharp.UnitTest/Statistics/NdArray.Mean.Test.cs @@ -8,7 +8,6 @@ namespace NumSharp.UnitTest.Statistics public class NdArrayMeanTest { [Test] - [OpenBugs] // keepdims returns wrong shape (1) instead of (1,1) public void Case1_Elementwise_keepdims() { var np1 = np.array(new double[] { 1, 2, 3, 4, 5, 6 }).reshape(3, 2); From 279698099e7138fcb0341597db93c473f1a85e4b Mon Sep 17 00:00:00 2001 From: Eli Belash Date: Sat, 14 Feb 2026 12:55:31 +0200 Subject: [PATCH 04/15] fix: extend keepdims fix to all reduction operations Extended the keepdims fix to all remaining reduction operations: - ReduceAMax (np.amax, np.max) - ReduceAMin (np.amin, np.min) - ReduceProduct (np.prod) - ReduceStd (np.std) - ReduceVar (np.var) Also fixed np.amax/np.amin API layer which ignored keepdims when axis=null. Added comprehensive parameterized test covering all reductions with multiple dtypes (Int32, Int64, Single, Double, Int16, Byte) to prevent regression. All 7 reduction functions now correctly preserve dimensions with keepdims=true, matching NumPy 2.x behavior. --- .../Math/Reduction/Default.Reduction.AMax.cs | 16 ++++- .../Math/Reduction/Default.Reduction.AMin.cs | 16 ++++- .../Reduction/Default.Reduction.Product.cs | 18 +++++- .../Math/Reduction/Default.Reduction.Std.cs | 16 ++++- .../Math/Reduction/Default.Reduction.Var.cs | 16 ++++- .../Sorting_Searching_Counting/np.amax.cs | 11 ++-- .../Sorting_Searching_Counting/np.min.cs | 12 ++-- .../Math/Reduction/ReduceAddTests.cs | 63 +++++++++++++++++++ 8 files changed, 142 insertions(+), 26 deletions(-) diff --git a/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.AMax.cs b/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.AMax.cs index a925d884..c06d591a 100644 --- a/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.AMax.cs +++ b/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.AMax.cs @@ -19,7 +19,13 @@ public override NDArray ReduceAMax(NDArray arr, int? axis_, bool keepdims = fals { var r = typeCode.HasValue ? Cast(arr, typeCode.Value, true) : arr.Clone(); if (keepdims) - r.Storage.ExpandDimension(0); + { + // NumPy: keepdims preserves the number of dimensions, all set to 1 + var keepdimsShape = new int[arr.ndim]; + for (int i = 0; i < arr.ndim; i++) + keepdimsShape[i] = 1; + r.Storage.Reshape(new Shape(keepdimsShape)); + } else if (!r.Shape.IsScalar && r.Shape.size == 1 && r.ndim == 1) r.Storage.Reshape(Shape.Scalar); @@ -30,7 +36,13 @@ public override NDArray ReduceAMax(NDArray arr, int? axis_, bool keepdims = fals { var r = NDArray.Scalar(amax_elementwise(arr, typeCode)); if (keepdims) - r.Storage.ExpandDimension(0); + { + // NumPy: keepdims preserves the number of dimensions, all set to 1 + var keepdimsShape = new int[arr.ndim]; + for (int i = 0; i < arr.ndim; i++) + keepdimsShape[i] = 1; + r.Storage.Reshape(new Shape(keepdimsShape)); + } else if (!r.Shape.IsScalar && r.Shape.size == 1 && r.ndim == 1) r.Storage.Reshape(Shape.Scalar); diff --git a/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.AMin.cs b/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.AMin.cs index 588e6007..526a768e 100644 --- a/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.AMin.cs +++ b/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.AMin.cs @@ -19,7 +19,13 @@ public override NDArray ReduceAMin(NDArray arr, int? axis_, bool keepdims = fals { var r = typeCode.HasValue ? Cast(arr, typeCode.Value, true) : arr.Clone(); if (keepdims) - r.Storage.ExpandDimension(0); + { + // NumPy: keepdims preserves the number of dimensions, all set to 1 + var keepdimsShape = new int[arr.ndim]; + for (int i = 0; i < arr.ndim; i++) + keepdimsShape[i] = 1; + r.Storage.Reshape(new Shape(keepdimsShape)); + } else if (!r.Shape.IsScalar && r.Shape.size == 1 && r.ndim == 1) r.Storage.Reshape(Shape.Scalar); @@ -30,7 +36,13 @@ public override NDArray ReduceAMin(NDArray arr, int? axis_, bool keepdims = fals { var r = NDArray.Scalar(amin_elementwise(arr, typeCode)); if (keepdims) - r.Storage.ExpandDimension(0); + { + // NumPy: keepdims preserves the number of dimensions, all set to 1 + var keepdimsShape = new int[arr.ndim]; + for (int i = 0; i < arr.ndim; i++) + keepdimsShape[i] = 1; + r.Storage.Reshape(new Shape(keepdimsShape)); + } else if (!r.Shape.IsScalar && r.Shape.size == 1 && r.ndim == 1) r.Storage.Reshape(Shape.Scalar); diff --git a/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.Product.cs b/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.Product.cs index 81bc391d..77d6065a 100644 --- a/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.Product.cs +++ b/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.Product.cs @@ -19,8 +19,14 @@ public override NDArray ReduceProduct(NDArray arr, int? axis_, bool keepdims = f { var r = NDArray.Scalar(typeCode.HasValue ? Converts.ChangeType(arr.GetAtIndex(0), typeCode.Value) : arr.GetAtIndex(0)); if (keepdims) - r.Storage.ExpandDimension(0); - + { + // NumPy: keepdims preserves the number of dimensions, all set to 1 + var keepdimsShape = new int[arr.ndim]; + for (int i = 0; i < arr.ndim; i++) + keepdimsShape[i] = 1; + r.Storage.Reshape(new Shape(keepdimsShape)); + } + return r; } @@ -28,7 +34,13 @@ public override NDArray ReduceProduct(NDArray arr, int? axis_, bool keepdims = f { var r = NDArray.Scalar(product_elementwise(arr, typeCode)); if (keepdims) - r.Storage.ExpandDimension(0); + { + // NumPy: keepdims preserves the number of dimensions, all set to 1 + var keepdimsShape = new int[arr.ndim]; + for (int i = 0; i < arr.ndim; i++) + keepdimsShape[i] = 1; + r.Storage.Reshape(new Shape(keepdimsShape)); + } else if (!r.Shape.IsScalar && r.Shape.size == 1 && r.ndim == 1) r.Storage.Reshape(Shape.Scalar); return r; diff --git a/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.Std.cs b/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.Std.cs index 34d0bebe..099cd8c4 100644 --- a/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.Std.cs +++ b/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.Std.cs @@ -16,7 +16,13 @@ public override NDArray ReduceStd(NDArray arr, int? axis_, bool keepdims = false { var r = NDArray.Scalar(0); if (keepdims) - r.Storage.ExpandDimension(0); + { + // NumPy: keepdims preserves the number of dimensions, all set to 1 + var keepdimsShape = new int[arr.ndim]; + for (int i = 0; i < arr.ndim; i++) + keepdimsShape[i] = 1; + r.Storage.Reshape(new Shape(keepdimsShape)); + } else if (!r.Shape.IsScalar && r.Shape.size == 1 && r.ndim == 1) r.Storage.Reshape(Shape.Scalar); return r; @@ -26,7 +32,13 @@ public override NDArray ReduceStd(NDArray arr, int? axis_, bool keepdims = false { var r = NDArray.Scalar(std_elementwise(arr, typeCode, ddof)); if (keepdims) - r.Storage.ExpandDimension(0); + { + // NumPy: keepdims preserves the number of dimensions, all set to 1 + var keepdimsShape = new int[arr.ndim]; + for (int i = 0; i < arr.ndim; i++) + keepdimsShape[i] = 1; + r.Storage.Reshape(new Shape(keepdimsShape)); + } else if (!r.Shape.IsScalar && r.Shape.size == 1 && r.ndim == 1) r.Storage.Reshape(Shape.Scalar); return r; diff --git a/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.Var.cs b/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.Var.cs index a0ac88b5..12f4ea16 100644 --- a/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.Var.cs +++ b/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.Var.cs @@ -15,7 +15,13 @@ public override NDArray ReduceVar(NDArray arr, int? axis_, bool keepdims = false { var r = NDArray.Scalar(0); if (keepdims) - r.Storage.ExpandDimension(0); + { + // NumPy: keepdims preserves the number of dimensions, all set to 1 + var keepdimsShape = new int[arr.ndim]; + for (int i = 0; i < arr.ndim; i++) + keepdimsShape[i] = 1; + r.Storage.Reshape(new Shape(keepdimsShape)); + } else if (!r.Shape.IsScalar && r.Shape.size == 1 && r.ndim == 1) r.Storage.Reshape(Shape.Scalar); return r; @@ -25,7 +31,13 @@ public override NDArray ReduceVar(NDArray arr, int? axis_, bool keepdims = false { var r = NDArray.Scalar(var_elementwise(arr, typeCode, ddof)); if (keepdims) - r.Storage.ExpandDimension(0); + { + // NumPy: keepdims preserves the number of dimensions, all set to 1 + var keepdimsShape = new int[arr.ndim]; + for (int i = 0; i < arr.ndim; i++) + keepdimsShape[i] = 1; + r.Storage.Reshape(new Shape(keepdimsShape)); + } else if (!r.Shape.IsScalar && r.Shape.size == 1 && r.ndim == 1) r.Storage.Reshape(Shape.Scalar); return r; diff --git a/src/NumSharp.Core/Sorting_Searching_Counting/np.amax.cs b/src/NumSharp.Core/Sorting_Searching_Counting/np.amax.cs index c1ce8218..18f21cc1 100644 --- a/src/NumSharp.Core/Sorting_Searching_Counting/np.amax.cs +++ b/src/NumSharp.Core/Sorting_Searching_Counting/np.amax.cs @@ -22,9 +22,8 @@ public static partial class np /// https://docs.scipy.org/doc/numpy/reference/generated/numpy.amax.html public static NDArray amax(NDArray a, int? axis = null, bool keepdims = false, Type dtype = null) { - if (!axis.HasValue) - return a.amax(dtype); - return a.amax(axis.Value, keepdims, dtype); + // Delegate to TensorEngine which handles keepdims for axis=null + return a.TensorEngine.ReduceAMax(a, axis, keepdims, dtype?.GetTypeCode()); } /// @@ -37,10 +36,8 @@ public static NDArray amax(NDArray a, int? axis = null, bool keepdims = false, T /// https://docs.scipy.org/doc/numpy/reference/generated/numpy.amax.html public static NDArray max(NDArray a, int? axis = null, bool keepdims = false, Type dtype = null) { - if (!axis.HasValue) - return a.amax(dtype); - - return a.amax(axis.Value, keepdims, dtype); + // Delegate to TensorEngine which handles keepdims for axis=null + return a.TensorEngine.ReduceAMax(a, axis, keepdims, dtype?.GetTypeCode()); } } } \ No newline at end of file diff --git a/src/NumSharp.Core/Sorting_Searching_Counting/np.min.cs b/src/NumSharp.Core/Sorting_Searching_Counting/np.min.cs index 44c40677..f5283a9f 100644 --- a/src/NumSharp.Core/Sorting_Searching_Counting/np.min.cs +++ b/src/NumSharp.Core/Sorting_Searching_Counting/np.min.cs @@ -24,10 +24,8 @@ public static partial class np /// https://docs.scipy.org/doc/numpy/reference/generated/numpy.amin.html public static NDArray amin(in NDArray a, int? axis = null, bool keepdims = false, Type dtype = null) { - if (!axis.HasValue) - return a.amin(dtype); - - return a.amin(axis.Value, keepdims, dtype); + // Delegate to TensorEngine which handles keepdims for axis=null + return a.TensorEngine.ReduceAMin(a, axis, keepdims, dtype?.GetTypeCode()); } /// @@ -41,10 +39,8 @@ public static NDArray amin(in NDArray a, int? axis = null, bool keepdims = false /// https://docs.scipy.org/doc/numpy/reference/generated/numpy.amin.html public static NDArray min(in NDArray a, int? axis = null, bool keepdims = false, Type dtype = null) { - if (!axis.HasValue) - return a.amin(dtype); - - return a.amin(axis.Value, keepdims, dtype); + // Delegate to TensorEngine which handles keepdims for axis=null + return a.TensorEngine.ReduceAMin(a, axis, keepdims, dtype?.GetTypeCode()); } } } diff --git a/test/NumSharp.UnitTest/Backends/Unmanaged/Math/Reduction/ReduceAddTests.cs b/test/NumSharp.UnitTest/Backends/Unmanaged/Math/Reduction/ReduceAddTests.cs index 8d669bf4..43e310d2 100644 --- a/test/NumSharp.UnitTest/Backends/Unmanaged/Math/Reduction/ReduceAddTests.cs +++ b/test/NumSharp.UnitTest/Backends/Unmanaged/Math/Reduction/ReduceAddTests.cs @@ -236,5 +236,68 @@ public void Case3_TurnIntoScalar() ret = np.sum(a); FluentExtension.Should(ret).BeScalar(5); } + + /// + /// Tests that all reduction operations with keepdims=true preserve dimensions + /// for all supported numeric dtypes. NumPy behavior: shape (M, N) with keepdims=true + /// should return shape (1, 1), not (1) or (). + /// + [Test] + [Arguments(NPTypeCode.Int32)] + [Arguments(NPTypeCode.Int64)] + [Arguments(NPTypeCode.Single)] + [Arguments(NPTypeCode.Double)] + [Arguments(NPTypeCode.Int16)] + [Arguments(NPTypeCode.Byte)] + public void Keepdims_AllReductions_PreservesDimensions(NPTypeCode dtype) + { + // Create 2D array with specific dtype + var arr = np.arange(6).reshape(2, 3).astype(dtype); + + // Test np.sum keepdims + var sumResult = np.sum(arr, keepdims: true); + sumResult.ndim.Should().Be(2, $"np.sum(dtype={dtype}) should preserve 2 dimensions with keepdims=true"); + sumResult.shape[0].Should().Be(1); + sumResult.shape[1].Should().Be(1); + + // Test np.mean keepdims (float types only for mean) + var meanResult = np.mean(arr, keepdims: true); + meanResult.ndim.Should().Be(2, $"np.mean(dtype={dtype}) should preserve 2 dimensions with keepdims=true"); + meanResult.shape[0].Should().Be(1); + meanResult.shape[1].Should().Be(1); + + // Test np.amax keepdims + var amaxResult = np.amax(arr, keepdims: true); + amaxResult.ndim.Should().Be(2, $"np.amax(dtype={dtype}) should preserve 2 dimensions with keepdims=true"); + amaxResult.shape[0].Should().Be(1); + amaxResult.shape[1].Should().Be(1); + + // Test np.amin keepdims + var aminResult = np.amin(arr, keepdims: true); + aminResult.ndim.Should().Be(2, $"np.amin(dtype={dtype}) should preserve 2 dimensions with keepdims=true"); + aminResult.shape[0].Should().Be(1); + aminResult.shape[1].Should().Be(1); + + // Test np.prod keepdims + var prodResult = np.prod(arr, keepdims: true); + prodResult.ndim.Should().Be(2, $"np.prod(dtype={dtype}) should preserve 2 dimensions with keepdims=true"); + prodResult.shape[0].Should().Be(1); + prodResult.shape[1].Should().Be(1); + } + + /// + /// Tests that keepdims=true works correctly for 3D arrays + /// + [Test] + public void Keepdims_3D_PreservesThreeDimensions() + { + var arr = np.arange(24).reshape(2, 3, 4); + + var result = np.sum(arr, keepdims: true); + result.ndim.Should().Be(3, "3D array with keepdims=true should return 3D"); + result.shape[0].Should().Be(1); + result.shape[1].Should().Be(1); + result.shape[2].Should().Be(1); + } } } From 40718598c40448d30e784c633026b8d3d2079926 Mon Sep 17 00:00:00 2001 From: Eli Belash Date: Sun, 15 Feb 2026 03:34:19 +0200 Subject: [PATCH 05/15] feat: IL Kernel Generator replaces 500K+ lines of generated code MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit introduces a dynamic IL code generation system for NumSharp's element-wise operations, replacing hundreds of thousands of lines of template-generated type-switch code with ~7K lines of IL emission logic. Architecture: - ILKernelGenerator.cs: Main IL emission engine (~4.5K lines) - Generates typed kernels at runtime via System.Reflection.Emit - SIMD vectorization for contiguous float/double arrays (Vector256) - Strided path for sliced/broadcast arrays via coordinate iteration - BinaryKernel.cs: Binary operation definitions (Add, Sub, Mul, Div, Mod) - UnaryKernel.cs: Unary operations (22 ops: Sin, Cos, Sqrt, Exp, etc.) - ReductionKernel.cs: Element-wise reductions (Sum, Prod, Max, Min, etc.) - ScalarKernel.cs: Scalar operation keys (eliminates dynamic dispatch) Dispatch files (DefaultEngine.*.cs): - BinaryOp.cs: Binary operation dispatch with type promotion - UnaryOp.cs: Unary operation dispatch - BitwiseOp.cs: Bitwise AND/OR/XOR (fixes broken & and | operators) - CompareOp.cs: Comparison operations (==, !=, <, >, <=, >=) - ReductionOp.cs: Element-wise reduction dispatch Bug fixes included: 1. operator & and operator | were completely broken (returned null) 2. Default.Log1p was incorrectly using Log10 instead of Log 3. Sliced array × scalar incorrectly used SIMD path (wrong indexing) 4. Division type promotion: int/int now returns float64 (NumPy 2.x) 5. Sign(NaN) threw ArithmeticException, now returns NaN Files deleted: 73 type-specific generated files (~500K lines) - Add/*.cs, Subtract/*.cs, Multiply/*.cs, Divide/*.cs, Mod/*.cs (60 files) - Equals/*.cs (13 files) Files simplified: 22 unary operation files now single-line delegations Test results: 2597 tests pass (excluding 11 skipped, OpenBugs excluded) --- .../Default/Math/Add/Default.Add.Boolean.cs | 8417 ----------------- .../Default/Math/Add/Default.Add.Byte.cs | 8417 ----------------- .../Default/Math/Add/Default.Add.Char.cs | 8417 ----------------- .../Default/Math/Add/Default.Add.Decimal.cs | 8417 ----------------- .../Default/Math/Add/Default.Add.Double.cs | 8417 ----------------- .../Default/Math/Add/Default.Add.Int16.cs | 8417 ----------------- .../Default/Math/Add/Default.Add.Int32.cs | 8417 ----------------- .../Default/Math/Add/Default.Add.Int64.cs | 8417 ----------------- .../Default/Math/Add/Default.Add.Single.cs | 8417 ----------------- .../Default/Math/Add/Default.Add.UInt16.cs | 8417 ----------------- .../Default/Math/Add/Default.Add.UInt32.cs | 8417 ----------------- .../Default/Math/Add/Default.Add.UInt64.cs | 8417 ----------------- .../Backends/Default/Math/Default.ACos.cs | 110 +- .../Backends/Default/Math/Default.ASin.cs | 110 +- .../Backends/Default/Math/Default.ATan.cs | 110 +- .../Backends/Default/Math/Default.Abs.cs | 105 +- .../Backends/Default/Math/Default.Add.cs | 32 +- .../Backends/Default/Math/Default.Ceil.cs | 61 +- .../Backends/Default/Math/Default.Cos.cs | 107 +- .../Backends/Default/Math/Default.Cosh.cs | 108 +- .../Backends/Default/Math/Default.Divide.cs | 32 +- .../Backends/Default/Math/Default.Exp.cs | 107 +- .../Backends/Default/Math/Default.Exp2.cs | 112 +- .../Backends/Default/Math/Default.Expm1.cs | 109 +- .../Backends/Default/Math/Default.Floor.cs | 61 +- .../Backends/Default/Math/Default.Log.cs | 107 +- .../Backends/Default/Math/Default.Log10.cs | 109 +- .../Backends/Default/Math/Default.Log1p.cs | 111 +- .../Backends/Default/Math/Default.Log2.cs | 109 +- .../Backends/Default/Math/Default.Mod.cs | 32 +- .../Backends/Default/Math/Default.Multiply.cs | 33 +- .../Backends/Default/Math/Default.Negate.cs | 243 +- .../Backends/Default/Math/Default.Round.cs | 114 +- .../Backends/Default/Math/Default.Sign.cs | 109 +- .../Backends/Default/Math/Default.Sin.cs | 108 +- .../Backends/Default/Math/Default.Sinh.cs | 109 +- .../Backends/Default/Math/Default.Sqrt.cs | 107 +- .../Backends/Default/Math/Default.Subtract.cs | 32 +- .../Backends/Default/Math/Default.Tan.cs | 109 +- .../Backends/Default/Math/Default.Tanh.cs | 108 +- .../Default/Math/DefaultEngine.BinaryOp.cs | 245 + .../Default/Math/DefaultEngine.BitwiseOp.cs | 35 + .../Default/Math/DefaultEngine.CompareOp.cs | 203 + .../Default/Math/DefaultEngine.ReductionOp.cs | 315 + .../Default/Math/DefaultEngine.UnaryOp.cs | 164 + .../Math/Divide/Default.Divide.Boolean.cs | 8417 ----------------- .../Math/Divide/Default.Divide.Byte.cs | 8417 ----------------- .../Math/Divide/Default.Divide.Char.cs | 8417 ----------------- .../Math/Divide/Default.Divide.Decimal.cs | 8417 ----------------- .../Math/Divide/Default.Divide.Double.cs | 8417 ----------------- .../Math/Divide/Default.Divide.Int16.cs | 8417 ----------------- .../Math/Divide/Default.Divide.Int32.cs | 8417 ----------------- .../Math/Divide/Default.Divide.Int64.cs | 8417 ----------------- .../Math/Divide/Default.Divide.Single.cs | 8417 ----------------- .../Math/Divide/Default.Divide.UInt16.cs | 8417 ----------------- .../Math/Divide/Default.Divide.UInt32.cs | 8417 ----------------- .../Math/Divide/Default.Divide.UInt64.cs | 8417 ----------------- .../Default/Math/Mod/Default.Mod.Boolean.cs | 8417 ----------------- .../Default/Math/Mod/Default.Mod.Byte.cs | 8417 ----------------- .../Default/Math/Mod/Default.Mod.Char.cs | 8417 ----------------- .../Default/Math/Mod/Default.Mod.Decimal.cs | 8417 ----------------- .../Default/Math/Mod/Default.Mod.Double.cs | 8417 ----------------- .../Default/Math/Mod/Default.Mod.Int16.cs | 8417 ----------------- .../Default/Math/Mod/Default.Mod.Int32.cs | 8417 ----------------- .../Default/Math/Mod/Default.Mod.Int64.cs | 8417 ----------------- .../Default/Math/Mod/Default.Mod.Single.cs | 8417 ----------------- .../Default/Math/Mod/Default.Mod.UInt16.cs | 8417 ----------------- .../Default/Math/Mod/Default.Mod.UInt32.cs | 8417 ----------------- .../Default/Math/Mod/Default.Mod.UInt64.cs | 8417 ----------------- .../Math/Multiply/Default.Multiply.Boolean.cs | 8417 ----------------- .../Math/Multiply/Default.Multiply.Byte.cs | 8417 ----------------- .../Math/Multiply/Default.Multiply.Char.cs | 8417 ----------------- .../Math/Multiply/Default.Multiply.Decimal.cs | 8417 ----------------- .../Math/Multiply/Default.Multiply.Double.cs | 8417 ----------------- .../Math/Multiply/Default.Multiply.Int16.cs | 8417 ----------------- .../Math/Multiply/Default.Multiply.Int32.cs | 8417 ----------------- .../Math/Multiply/Default.Multiply.Int64.cs | 8417 ----------------- .../Math/Multiply/Default.Multiply.Single.cs | 8417 ----------------- .../Math/Multiply/Default.Multiply.UInt16.cs | 8417 ----------------- .../Math/Multiply/Default.Multiply.UInt32.cs | 8417 ----------------- .../Math/Multiply/Default.Multiply.UInt64.cs | 8417 ----------------- .../Math/Reduction/Default.Reduction.AMax.cs | 3 +- .../Math/Reduction/Default.Reduction.AMin.cs | 3 +- .../Math/Reduction/Default.Reduction.Add.cs | 5 +- .../Reduction/Default.Reduction.ArgMax.cs | 3 +- .../Reduction/Default.Reduction.ArgMin.cs | 3 +- .../Math/Reduction/Default.Reduction.Mean.cs | 3 +- .../Reduction/Default.Reduction.Product.cs | 3 +- .../Math/Subtract/Default.Subtract.Boolean.cs | 8417 ----------------- .../Math/Subtract/Default.Subtract.Byte.cs | 8417 ----------------- .../Math/Subtract/Default.Subtract.Char.cs | 8417 ----------------- .../Math/Subtract/Default.Subtract.Decimal.cs | 8417 ----------------- .../Math/Subtract/Default.Subtract.Double.cs | 8417 ----------------- .../Math/Subtract/Default.Subtract.Int16.cs | 8417 ----------------- .../Math/Subtract/Default.Subtract.Int32.cs | 8417 ----------------- .../Math/Subtract/Default.Subtract.Int64.cs | 8417 ----------------- .../Math/Subtract/Default.Subtract.Single.cs | 8417 ----------------- .../Math/Subtract/Default.Subtract.UInt16.cs | 8417 ----------------- .../Math/Subtract/Default.Subtract.UInt32.cs | 8417 ----------------- .../Math/Subtract/Default.Subtract.UInt64.cs | 8417 ----------------- .../Backends/Kernels/BinaryKernel.cs | 284 + .../Backends/Kernels/ILKernelGenerator.cs | 4498 +++++++++ .../Backends/Kernels/KernelCache.cs | 173 + .../Backends/Kernels/ReductionKernel.cs | 377 + .../Backends/Kernels/ScalarKernel.cs | 47 + .../Backends/Kernels/SimdKernels.cs | 626 ++ .../Backends/Kernels/SimdThresholds.cs | 65 + .../Backends/Kernels/StrideDetector.cs | 121 + src/NumSharp.Core/Backends/TensorEngine.cs | 13 +- .../Unmanaged/UnmanagedStorage.Slicing.cs | 14 +- .../Generics/NDArray`1.Operators.cs | 31 + .../Equals/Default.Equals.Boolean.cs | 348 - .../Elementwise/Equals/Default.Equals.Byte.cs | 349 - .../Elementwise/Equals/Default.Equals.Char.cs | 349 - .../Equals/Default.Equals.Decimal.cs | 349 - .../Equals/Default.Equals.Double.cs | 349 - .../Equals/Default.Equals.Int16.cs | 349 - .../Equals/Default.Equals.Int32.cs | 349 - .../Equals/Default.Equals.Int64.cs | 349 - .../Equals/Default.Equals.Single.cs | 349 - .../Equals/Default.Equals.UInt16.cs | 349 - .../Equals/Default.Equals.UInt32.cs | 349 - .../Equals/Default.Equals.UInt64.cs | 349 - .../Elementwise/Equals/Default.Equals.cs | 41 - .../Operations/Elementwise/NDArray.AND.cs | 82 +- .../Operations/Elementwise/NDArray.Equals.cs | 49 +- .../Operations/Elementwise/NDArray.Greater.cs | 129 +- .../Operations/Elementwise/NDArray.Lower.cs | 131 +- .../Elementwise/NDArray.NotEquals.cs | 122 +- .../Operations/Elementwise/NDArray.OR.cs | 80 +- .../Backends/Kernels/BattleProofTests.cs | 222 + .../Backends/Kernels/BinaryOpTests.cs | 608 ++ .../Backends/Kernels/BitwiseOpTests.cs | 389 + .../Backends/Kernels/ComparisonOpTests.cs | 509 + .../Backends/Kernels/EdgeCaseTests.cs | 921 ++ .../Backends/Kernels/IndexingEdgeCaseTests.cs | 382 + .../Backends/Kernels/LinearAlgebraTests.cs | 378 + .../Kernels/ManipulationEdgeCaseTests.cs | 449 + .../Backends/Kernels/ReductionOpTests.cs | 554 ++ .../Backends/Kernels/SlicedArrayOpTests.cs | 642 ++ .../Backends/Kernels/UnaryOpTests.cs | 532 ++ .../Unmanaged/Math/np_divide_tests.cs | 11 +- test/NumSharp.UnitTest/GlobalUsings.cs | 2 + test/NumSharp.UnitTest/Logic/NEP50.cs | 24 +- test/NumSharp.UnitTest/OpenBugs.cs | 30 +- .../Utilities/FluentExtension.cs | 154 +- .../View/Shape.OffsetParity.Tests.cs | 1 - 147 files changed, 13553 insertions(+), 512034 deletions(-) delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Add/Default.Add.Boolean.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Add/Default.Add.Byte.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Add/Default.Add.Char.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Add/Default.Add.Decimal.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Add/Default.Add.Double.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Add/Default.Add.Int16.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Add/Default.Add.Int32.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Add/Default.Add.Int64.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Add/Default.Add.Single.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Add/Default.Add.UInt16.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Add/Default.Add.UInt32.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Add/Default.Add.UInt64.cs create mode 100644 src/NumSharp.Core/Backends/Default/Math/DefaultEngine.BinaryOp.cs create mode 100644 src/NumSharp.Core/Backends/Default/Math/DefaultEngine.BitwiseOp.cs create mode 100644 src/NumSharp.Core/Backends/Default/Math/DefaultEngine.CompareOp.cs create mode 100644 src/NumSharp.Core/Backends/Default/Math/DefaultEngine.ReductionOp.cs create mode 100644 src/NumSharp.Core/Backends/Default/Math/DefaultEngine.UnaryOp.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Divide/Default.Divide.Boolean.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Divide/Default.Divide.Byte.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Divide/Default.Divide.Char.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Divide/Default.Divide.Decimal.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Divide/Default.Divide.Double.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Divide/Default.Divide.Int16.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Divide/Default.Divide.Int32.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Divide/Default.Divide.Int64.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Divide/Default.Divide.Single.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Divide/Default.Divide.UInt16.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Divide/Default.Divide.UInt32.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Divide/Default.Divide.UInt64.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Mod/Default.Mod.Boolean.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Mod/Default.Mod.Byte.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Mod/Default.Mod.Char.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Mod/Default.Mod.Decimal.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Mod/Default.Mod.Double.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Mod/Default.Mod.Int16.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Mod/Default.Mod.Int32.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Mod/Default.Mod.Int64.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Mod/Default.Mod.Single.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Mod/Default.Mod.UInt16.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Mod/Default.Mod.UInt32.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Mod/Default.Mod.UInt64.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Multiply/Default.Multiply.Boolean.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Multiply/Default.Multiply.Byte.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Multiply/Default.Multiply.Char.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Multiply/Default.Multiply.Decimal.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Multiply/Default.Multiply.Double.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Multiply/Default.Multiply.Int16.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Multiply/Default.Multiply.Int32.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Multiply/Default.Multiply.Int64.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Multiply/Default.Multiply.Single.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Multiply/Default.Multiply.UInt16.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Multiply/Default.Multiply.UInt32.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Multiply/Default.Multiply.UInt64.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Subtract/Default.Subtract.Boolean.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Subtract/Default.Subtract.Byte.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Subtract/Default.Subtract.Char.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Subtract/Default.Subtract.Decimal.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Subtract/Default.Subtract.Double.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Subtract/Default.Subtract.Int16.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Subtract/Default.Subtract.Int32.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Subtract/Default.Subtract.Int64.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Subtract/Default.Subtract.Single.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Subtract/Default.Subtract.UInt16.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Subtract/Default.Subtract.UInt32.cs delete mode 100644 src/NumSharp.Core/Backends/Default/Math/Subtract/Default.Subtract.UInt64.cs create mode 100644 src/NumSharp.Core/Backends/Kernels/BinaryKernel.cs create mode 100644 src/NumSharp.Core/Backends/Kernels/ILKernelGenerator.cs create mode 100644 src/NumSharp.Core/Backends/Kernels/KernelCache.cs create mode 100644 src/NumSharp.Core/Backends/Kernels/ReductionKernel.cs create mode 100644 src/NumSharp.Core/Backends/Kernels/ScalarKernel.cs create mode 100644 src/NumSharp.Core/Backends/Kernels/SimdKernels.cs create mode 100644 src/NumSharp.Core/Backends/Kernels/SimdThresholds.cs create mode 100644 src/NumSharp.Core/Backends/Kernels/StrideDetector.cs create mode 100644 src/NumSharp.Core/Generics/NDArray`1.Operators.cs delete mode 100644 src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.Boolean.cs delete mode 100644 src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.Byte.cs delete mode 100644 src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.Char.cs delete mode 100644 src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.Decimal.cs delete mode 100644 src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.Double.cs delete mode 100644 src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.Int16.cs delete mode 100644 src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.Int32.cs delete mode 100644 src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.Int64.cs delete mode 100644 src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.Single.cs delete mode 100644 src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.UInt16.cs delete mode 100644 src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.UInt32.cs delete mode 100644 src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.UInt64.cs delete mode 100644 src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.cs create mode 100644 test/NumSharp.UnitTest/Backends/Kernels/BattleProofTests.cs create mode 100644 test/NumSharp.UnitTest/Backends/Kernels/BinaryOpTests.cs create mode 100644 test/NumSharp.UnitTest/Backends/Kernels/BitwiseOpTests.cs create mode 100644 test/NumSharp.UnitTest/Backends/Kernels/ComparisonOpTests.cs create mode 100644 test/NumSharp.UnitTest/Backends/Kernels/EdgeCaseTests.cs create mode 100644 test/NumSharp.UnitTest/Backends/Kernels/IndexingEdgeCaseTests.cs create mode 100644 test/NumSharp.UnitTest/Backends/Kernels/LinearAlgebraTests.cs create mode 100644 test/NumSharp.UnitTest/Backends/Kernels/ManipulationEdgeCaseTests.cs create mode 100644 test/NumSharp.UnitTest/Backends/Kernels/ReductionOpTests.cs create mode 100644 test/NumSharp.UnitTest/Backends/Kernels/SlicedArrayOpTests.cs create mode 100644 test/NumSharp.UnitTest/Backends/Kernels/UnaryOpTests.cs create mode 100644 test/NumSharp.UnitTest/GlobalUsings.cs diff --git a/src/NumSharp.Core/Backends/Default/Math/Add/Default.Add.Boolean.cs b/src/NumSharp.Core/Backends/Default/Math/Add/Default.Add.Boolean.cs deleted file mode 100644 index 5974853b..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Add/Default.Add.Boolean.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray AddBoolean(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of bool - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Add" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((bool*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("bool"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((bool*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToByte(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToByte(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToByte(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToByte(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToByte(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToByte(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToByte(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToByte(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt16(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt16(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt16(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt16(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToInt16(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt16(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToInt16(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToInt16(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt16(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt16(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt16(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt16(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToUInt16(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt16(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToUInt16(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToUInt16(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt32(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt32(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt32(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt32(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToInt32(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt32(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToInt32(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToInt32(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt32(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt32(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt32(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt32(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToUInt32(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt32(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToUInt32(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToUInt32(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt64(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt64(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt64(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt64(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToInt64(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt64(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToInt64(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToInt64(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt64(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt64(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt64(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt64(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToUInt64(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt64(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToUInt64(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToUInt64(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToChar(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToChar(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToChar(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToChar(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToChar(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToChar(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToChar(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToChar(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDouble(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDouble(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDouble(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDouble(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToDouble(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDouble(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToDouble(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToDouble(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToSingle(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToSingle(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToSingle(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToSingle(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToSingle(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToSingle(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToSingle(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToSingle(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDecimal(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDecimal(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDecimal(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDecimal(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToDecimal(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDecimal(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToDecimal(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToDecimal(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((bool*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((bool*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((bool*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((bool*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((bool*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((bool*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((bool*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((bool*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((bool*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((bool*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((bool*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Add/Default.Add.Byte.cs b/src/NumSharp.Core/Backends/Default/Math/Add/Default.Add.Byte.cs deleted file mode 100644 index 77d75f25..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Add/Default.Add.Byte.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray AddByte(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of byte - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Add" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((byte*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("byte"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((byte*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((byte*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((byte*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((byte*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((byte*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((byte*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((byte*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((byte*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((byte*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((byte*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((byte*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((byte*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Add/Default.Add.Char.cs b/src/NumSharp.Core/Backends/Default/Math/Add/Default.Add.Char.cs deleted file mode 100644 index 8bcc23c8..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Add/Default.Add.Char.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray AddChar(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of char - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Add" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((char*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("char"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((char*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((char*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((char*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((char*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((char*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((char*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((char*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((char*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((char*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((char*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((char*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((char*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Add/Default.Add.Decimal.cs b/src/NumSharp.Core/Backends/Default/Math/Add/Default.Add.Decimal.cs deleted file mode 100644 index 69fd4b14..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Add/Default.Add.Decimal.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray AddDecimal(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of decimal - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Add" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((decimal*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("decimal"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((decimal*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((decimal*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((decimal*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((decimal*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((decimal*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((decimal*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((decimal*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((decimal*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((decimal*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((decimal*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((decimal*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((decimal*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Add/Default.Add.Double.cs b/src/NumSharp.Core/Backends/Default/Math/Add/Default.Add.Double.cs deleted file mode 100644 index e9f5bdf2..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Add/Default.Add.Double.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray AddDouble(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of double - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Add" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((double*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("double"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((double*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((double*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((double*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((double*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((double*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((double*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((double*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((double*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((double*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((double*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((double*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((double*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Add/Default.Add.Int16.cs b/src/NumSharp.Core/Backends/Default/Math/Add/Default.Add.Int16.cs deleted file mode 100644 index 45f327f1..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Add/Default.Add.Int16.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray AddInt16(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of short - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Add" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((short*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("short"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((short*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((short*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((short*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((short*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((short*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((short*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((short*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((short*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((short*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((short*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((short*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((short*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Add/Default.Add.Int32.cs b/src/NumSharp.Core/Backends/Default/Math/Add/Default.Add.Int32.cs deleted file mode 100644 index 44689ea3..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Add/Default.Add.Int32.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray AddInt32(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of int - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Add" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((int*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("int"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((int*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((int*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((int*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((int*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((int*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((int*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((int*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((int*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((int*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((int*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((int*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((int*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Add/Default.Add.Int64.cs b/src/NumSharp.Core/Backends/Default/Math/Add/Default.Add.Int64.cs deleted file mode 100644 index ff6e3e79..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Add/Default.Add.Int64.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray AddInt64(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of long - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Add" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((long*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("long"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((long*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((long*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((long*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((long*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((long*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((long*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((long*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((long*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((long*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((long*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((long*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((long*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Add/Default.Add.Single.cs b/src/NumSharp.Core/Backends/Default/Math/Add/Default.Add.Single.cs deleted file mode 100644 index 0c1b5200..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Add/Default.Add.Single.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray AddSingle(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of float - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Add" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((float*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("float"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((float*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((float*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((float*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((float*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((float*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((float*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((float*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((float*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((float*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((float*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((float*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((float*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Add/Default.Add.UInt16.cs b/src/NumSharp.Core/Backends/Default/Math/Add/Default.Add.UInt16.cs deleted file mode 100644 index 0c25ecb1..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Add/Default.Add.UInt16.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray AddUInt16(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of ushort - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Add" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((ushort*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("ushort"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((ushort*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((ushort*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((ushort*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((ushort*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((ushort*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((ushort*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((ushort*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((ushort*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((ushort*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((ushort*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((ushort*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((ushort*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Add/Default.Add.UInt32.cs b/src/NumSharp.Core/Backends/Default/Math/Add/Default.Add.UInt32.cs deleted file mode 100644 index e89a7b8c..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Add/Default.Add.UInt32.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray AddUInt32(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of uint - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Add" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((uint*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("uint"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((uint*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((uint*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((uint*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((uint*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((uint*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((uint*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((uint*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((uint*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((uint*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((uint*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((uint*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((uint*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Add/Default.Add.UInt64.cs b/src/NumSharp.Core/Backends/Default/Math/Add/Default.Add.UInt64.cs deleted file mode 100644 index 3037f12e..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Add/Default.Add.UInt64.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray AddUInt64(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of ulong - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Add" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((ulong*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("ulong"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((ulong*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((ulong*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((ulong*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((ulong*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((ulong*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((ulong*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((ulong*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((ulong*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((ulong*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((ulong*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((ulong*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Add(*((ulong*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Add(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Add((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Default.ACos.cs b/src/NumSharp.Core/Backends/Default/Math/Default.ACos.cs index b5323c4b..cb822418 100644 --- a/src/NumSharp.Core/Backends/Default/Math/Default.ACos.cs +++ b/src/NumSharp.Core/Backends/Default/Math/Default.ACos.cs @@ -1,7 +1,5 @@ -using System; -using DecimalMath; -using NumSharp.Utilities; -using System.Threading.Tasks; +using System; +using NumSharp.Backends.Kernels; namespace NumSharp.Backends { @@ -9,108 +7,12 @@ public partial class DefaultEngine { public override NDArray ACos(in NDArray nd, Type dtype) => ACos(nd, dtype?.GetTypeCode()); + /// + /// Element-wise inverse cosine (arccos) using IL-generated kernels. + /// public override NDArray ACos(in NDArray nd, NPTypeCode? typeCode = null) { - if (nd.size == 0) - return nd.Clone(); - - - var @out = Cast(nd, ResolveUnaryReturnType(nd, typeCode), copy: true); - var len = @out.size; - - unsafe - { - switch (@out.GetTypeCode) - { -#if _REGEN - %foreach except(supported_numericals, "Decimal"),except(supported_numericals_lowercase, "decimal")% - case NPTypeCode.#1: - { - var out_addr = (#2*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.To#1(Math.Acos(out_addr[i])); - return @out; - } - % - case NPTypeCode.Decimal: - { - var out_addr = (decimal*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = (decimal)(Math.Acos(Converts.ToDouble(out_addr[i]))); - return @out; - } - default: - throw new NotSupportedException(); -#else - case NPTypeCode.Byte: - { - var out_addr = (byte*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToByte(Math.Acos(out_addr[i])); - return @out; - } - case NPTypeCode.Int16: - { - var out_addr = (short*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt16(Math.Acos(out_addr[i])); - return @out; - } - case NPTypeCode.UInt16: - { - var out_addr = (ushort*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt16(Math.Acos(out_addr[i])); - return @out; - } - case NPTypeCode.Int32: - { - var out_addr = (int*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt32(Math.Acos(out_addr[i])); - return @out; - } - case NPTypeCode.UInt32: - { - var out_addr = (uint*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt32(Math.Acos(out_addr[i])); - return @out; - } - case NPTypeCode.Int64: - { - var out_addr = (long*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt64(Math.Acos(out_addr[i])); - return @out; - } - case NPTypeCode.UInt64: - { - var out_addr = (ulong*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt64(Math.Acos(out_addr[i])); - return @out; - } - case NPTypeCode.Char: - { - var out_addr = (char*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToChar(Math.Acos(out_addr[i])); - return @out; - } - case NPTypeCode.Double: - { - var out_addr = (double*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToDouble(Math.Acos(out_addr[i])); - return @out; - } - case NPTypeCode.Single: - { - var out_addr = (float*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToSingle(Math.Acos(out_addr[i])); - return @out; - } - case NPTypeCode.Decimal: - { - var out_addr = (decimal*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = (decimal)(Math.Acos(Converts.ToDouble(out_addr[i]))); - return @out; - } - default: - throw new NotSupportedException(); -#endif - } - } + return ExecuteUnaryOp(in nd, UnaryOp.ACos, ResolveUnaryReturnType(nd, typeCode)); } } } diff --git a/src/NumSharp.Core/Backends/Default/Math/Default.ASin.cs b/src/NumSharp.Core/Backends/Default/Math/Default.ASin.cs index c7164541..b8fe2aa9 100644 --- a/src/NumSharp.Core/Backends/Default/Math/Default.ASin.cs +++ b/src/NumSharp.Core/Backends/Default/Math/Default.ASin.cs @@ -1,7 +1,5 @@ -using System; -using DecimalMath; -using NumSharp.Utilities; -using System.Threading.Tasks; +using System; +using NumSharp.Backends.Kernels; namespace NumSharp.Backends { @@ -9,108 +7,12 @@ public partial class DefaultEngine { public override NDArray ASin(in NDArray nd, Type dtype) => ASin(nd, dtype?.GetTypeCode()); + /// + /// Element-wise inverse sine (arcsin) using IL-generated kernels. + /// public override NDArray ASin(in NDArray nd, NPTypeCode? typeCode = null) { - if (nd.size == 0) - return nd.Clone(); - - - var @out = Cast(nd, ResolveUnaryReturnType(nd, typeCode), copy: true); - var len = @out.size; - - unsafe - { - switch (@out.GetTypeCode) - { -#if _REGEN - %foreach except(supported_numericals, "Decimal"),except(supported_numericals_lowercase, "decimal")% - case NPTypeCode.#1: - { - var out_addr = (#2*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.To#1(Math.Asin(out_addr[i])); - return @out; - } - % - case NPTypeCode.Decimal: - { - var out_addr = (decimal*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = (decimal)(Math.Asin(Converts.ToDouble(out_addr[i]))); - return @out; - } - default: - throw new NotSupportedException(); -#else - case NPTypeCode.Byte: - { - var out_addr = (byte*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToByte(Math.Asin(out_addr[i])); - return @out; - } - case NPTypeCode.Int16: - { - var out_addr = (short*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt16(Math.Asin(out_addr[i])); - return @out; - } - case NPTypeCode.UInt16: - { - var out_addr = (ushort*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt16(Math.Asin(out_addr[i])); - return @out; - } - case NPTypeCode.Int32: - { - var out_addr = (int*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt32(Math.Asin(out_addr[i])); - return @out; - } - case NPTypeCode.UInt32: - { - var out_addr = (uint*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt32(Math.Asin(out_addr[i])); - return @out; - } - case NPTypeCode.Int64: - { - var out_addr = (long*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt64(Math.Asin(out_addr[i])); - return @out; - } - case NPTypeCode.UInt64: - { - var out_addr = (ulong*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt64(Math.Asin(out_addr[i])); - return @out; - } - case NPTypeCode.Char: - { - var out_addr = (char*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToChar(Math.Asin(out_addr[i])); - return @out; - } - case NPTypeCode.Double: - { - var out_addr = (double*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToDouble(Math.Asin(out_addr[i])); - return @out; - } - case NPTypeCode.Single: - { - var out_addr = (float*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToSingle(Math.Asin(out_addr[i])); - return @out; - } - case NPTypeCode.Decimal: - { - var out_addr = (decimal*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = (decimal)(Math.Asin(Converts.ToDouble(out_addr[i]))); - return @out; - } - default: - throw new NotSupportedException(); -#endif - } - } + return ExecuteUnaryOp(in nd, UnaryOp.ASin, ResolveUnaryReturnType(nd, typeCode)); } } } diff --git a/src/NumSharp.Core/Backends/Default/Math/Default.ATan.cs b/src/NumSharp.Core/Backends/Default/Math/Default.ATan.cs index 59d4f587..67e8c4ab 100644 --- a/src/NumSharp.Core/Backends/Default/Math/Default.ATan.cs +++ b/src/NumSharp.Core/Backends/Default/Math/Default.ATan.cs @@ -1,7 +1,5 @@ -using System; -using DecimalMath; -using NumSharp.Utilities; -using System.Threading.Tasks; +using System; +using NumSharp.Backends.Kernels; namespace NumSharp.Backends { @@ -9,108 +7,12 @@ public partial class DefaultEngine { public override NDArray ATan(in NDArray nd, Type dtype) => ATan(nd, dtype?.GetTypeCode()); + /// + /// Element-wise inverse tangent (arctan) using IL-generated kernels. + /// public override NDArray ATan(in NDArray nd, NPTypeCode? typeCode = null) { - if (nd.size == 0) - return nd.Clone(); - - - var @out = Cast(nd, ResolveUnaryReturnType(nd, typeCode), copy: true); - var len = @out.size; - - unsafe - { - switch (@out.GetTypeCode) - { -#if _REGEN - %foreach except(supported_numericals, "Decimal"),except(supported_numericals_lowercase, "decimal")% - case NPTypeCode.#1: - { - var out_addr = (#2*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.To#1(Math.Atan(out_addr[i])); - return @out; - } - % - case NPTypeCode.Decimal: - { - var out_addr = (decimal*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = (decimal)(Math.Atan(Converts.ToDouble(out_addr[i]))); - return @out; - } - default: - throw new NotSupportedException(); -#else - case NPTypeCode.Byte: - { - var out_addr = (byte*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToByte(Math.Atan(out_addr[i])); - return @out; - } - case NPTypeCode.Int16: - { - var out_addr = (short*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt16(Math.Atan(out_addr[i])); - return @out; - } - case NPTypeCode.UInt16: - { - var out_addr = (ushort*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt16(Math.Atan(out_addr[i])); - return @out; - } - case NPTypeCode.Int32: - { - var out_addr = (int*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt32(Math.Atan(out_addr[i])); - return @out; - } - case NPTypeCode.UInt32: - { - var out_addr = (uint*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt32(Math.Atan(out_addr[i])); - return @out; - } - case NPTypeCode.Int64: - { - var out_addr = (long*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt64(Math.Atan(out_addr[i])); - return @out; - } - case NPTypeCode.UInt64: - { - var out_addr = (ulong*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt64(Math.Atan(out_addr[i])); - return @out; - } - case NPTypeCode.Char: - { - var out_addr = (char*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToChar(Math.Atan(out_addr[i])); - return @out; - } - case NPTypeCode.Double: - { - var out_addr = (double*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToDouble(Math.Atan(out_addr[i])); - return @out; - } - case NPTypeCode.Single: - { - var out_addr = (float*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToSingle(Math.Atan(out_addr[i])); - return @out; - } - case NPTypeCode.Decimal: - { - var out_addr = (decimal*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = (decimal)(Math.Atan(Converts.ToDouble(out_addr[i]))); - return @out; - } - default: - throw new NotSupportedException(); -#endif - } - } + return ExecuteUnaryOp(in nd, UnaryOp.ATan, ResolveUnaryReturnType(nd, typeCode)); } } } diff --git a/src/NumSharp.Core/Backends/Default/Math/Default.Abs.cs b/src/NumSharp.Core/Backends/Default/Math/Default.Abs.cs index da5b2ab5..d9271824 100644 --- a/src/NumSharp.Core/Backends/Default/Math/Default.Abs.cs +++ b/src/NumSharp.Core/Backends/Default/Math/Default.Abs.cs @@ -1,7 +1,5 @@ using System; -using System.Threading.Tasks; -using DecimalMath; -using NumSharp.Utilities; +using NumSharp.Backends.Kernels; namespace NumSharp.Backends { @@ -9,102 +7,19 @@ public partial class DefaultEngine { public override NDArray Abs(in NDArray nd, Type dtype) => Abs(nd, dtype?.GetTypeCode()); + /// + /// Element-wise absolute value using IL-generated kernels. + /// public override NDArray Abs(in NDArray nd, NPTypeCode? typeCode = null) { - if (nd.size == 0) - return nd.Clone(); - - var @out = Cast(nd, ResolveUnaryReturnType(nd, typeCode), copy: true); - if (@out.typecode.IsUnsigned()) - return @out; - - var len = @out.size; - - unsafe + // Unsigned types are already non-negative - just return a copy with type cast + var outputType = ResolveUnaryReturnType(nd, typeCode); + if (nd.typecode.IsUnsigned()) { - switch (@out.GetTypeCode) - { -#if _REGEN - %foreach except(supported_numericals, "Decimal"),except(supported_numericals_lowercase, "decimal")% - case NPTypeCode.#1: - { - var out_addr = (#2*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.To#1(Math.Abs(out_addr[i]))); - return @out; - } - % - case NPTypeCode.Decimal: - { - var out_addr = (decimal*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = (DecimalEx.Abs(out_addr[i])); - return @out; - } - default: - throw new NotSupportedException(); -#else - case NPTypeCode.Byte: - { - return @out; - } - case NPTypeCode.Int16: - { - var out_addr = (short*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt16(Math.Abs(out_addr[i])); - return @out; - } - case NPTypeCode.UInt16: - { - return @out; - } - case NPTypeCode.Int32: - { - var out_addr = (int*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt32(Math.Abs(out_addr[i])); - return @out; - } - case NPTypeCode.UInt32: - { - return @out; - } - case NPTypeCode.Int64: - { - var out_addr = (long*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt64(Math.Abs(out_addr[i])); - return @out; - } - case NPTypeCode.UInt64: - { - return @out; - } - case NPTypeCode.Char: - { - var out_addr = (char*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToChar(Math.Abs(out_addr[i])); - return @out; - } - case NPTypeCode.Double: - { - var out_addr = (double*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToDouble(Math.Abs(out_addr[i])); - return @out; - } - case NPTypeCode.Single: - { - var out_addr = (float*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToSingle(Math.Abs(out_addr[i])); - return @out; - } - case NPTypeCode.Decimal: - { - var out_addr = (decimal*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = (DecimalEx.Abs(out_addr[i])); - return @out; - } - default: - throw new NotSupportedException(); -#endif - } + return Cast(nd, outputType, copy: true); } + + return ExecuteUnaryOp(in nd, UnaryOp.Abs, outputType); } } } diff --git a/src/NumSharp.Core/Backends/Default/Math/Default.Add.cs b/src/NumSharp.Core/Backends/Default/Math/Default.Add.cs index 3c79396f..865cf2ab 100644 --- a/src/NumSharp.Core/Backends/Default/Math/Default.Add.cs +++ b/src/NumSharp.Core/Backends/Default/Math/Default.Add.cs @@ -1,36 +1,16 @@ -using System; +using NumSharp.Backends.Kernels; namespace NumSharp.Backends { public partial class DefaultEngine { + /// + /// Element-wise addition using IL-generated kernels. + /// Supports all 144 type combinations with automatic type promotion. + /// public override NDArray Add(in NDArray lhs, in NDArray rhs) { - switch (lhs.GetTypeCode) - { -#if _REGEN - %foreach supported_dtypes,supported_dtypes_lowercase% - case NPTypeCode.#1: return Add#1(lhs, rhs); - % - default: - throw new NotSupportedException(); -#else - case NPTypeCode.Boolean: return AddBoolean(lhs, rhs); - case NPTypeCode.Byte: return AddByte(lhs, rhs); - case NPTypeCode.Int16: return AddInt16(lhs, rhs); - case NPTypeCode.UInt16: return AddUInt16(lhs, rhs); - case NPTypeCode.Int32: return AddInt32(lhs, rhs); - case NPTypeCode.UInt32: return AddUInt32(lhs, rhs); - case NPTypeCode.Int64: return AddInt64(lhs, rhs); - case NPTypeCode.UInt64: return AddUInt64(lhs, rhs); - case NPTypeCode.Char: return AddChar(lhs, rhs); - case NPTypeCode.Double: return AddDouble(lhs, rhs); - case NPTypeCode.Single: return AddSingle(lhs, rhs); - case NPTypeCode.Decimal: return AddDecimal(lhs, rhs); - default: - throw new NotSupportedException(); -#endif - } + return ExecuteBinaryOp(in lhs, in rhs, BinaryOp.Add); } } } diff --git a/src/NumSharp.Core/Backends/Default/Math/Default.Ceil.cs b/src/NumSharp.Core/Backends/Default/Math/Default.Ceil.cs index a5d7b91b..d496bbda 100644 --- a/src/NumSharp.Core/Backends/Default/Math/Default.Ceil.cs +++ b/src/NumSharp.Core/Backends/Default/Math/Default.Ceil.cs @@ -1,7 +1,5 @@ -using System; -using System.Threading.Tasks; -using DecimalMath; -using NumSharp.Utilities; +using System; +using NumSharp.Backends.Kernels; namespace NumSharp.Backends { @@ -9,59 +7,12 @@ public partial class DefaultEngine { public override NDArray Ceil(in NDArray nd, Type dtype) => Ceil(nd, dtype?.GetTypeCode()); + /// + /// Element-wise ceiling using IL-generated kernels. + /// public override NDArray Ceil(in NDArray nd, NPTypeCode? typeCode = null) { - if (nd.size == 0) - return nd.Clone(); - - var @out = Cast(nd, ResolveUnaryReturnType(nd, typeCode), copy: true); - var len = @out.size; - - unsafe - { - switch (@out.GetTypeCode) - { -#if _REGEN - %foreach except(supported_numericals, "Decimal"),except(supported_numericals_lowercase, "decimal")% - case NPTypeCode.#1: - { - var out_addr = (#2*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.To#1(Math.Ceiling(out_addr[i])); - return @out; - } - % - case NPTypeCode.Decimal: - { - var out_addr = (decimal*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = (DecimalEx.Ceiling(out_addr[i])); - return @out; - } - default: - throw new NotSupportedException(); -#else - case NPTypeCode.Double: - { - var out_addr = (double*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToDouble(Math.Ceiling(out_addr[i])); - return @out; - } - case NPTypeCode.Single: - { - var out_addr = (float*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToSingle(Math.Ceiling(out_addr[i])); - return @out; - } - case NPTypeCode.Decimal: - { - var out_addr = (decimal*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = (DecimalEx.Ceiling(out_addr[i])); - return @out; - } - default: - throw new NotSupportedException(); -#endif - } - } + return ExecuteUnaryOp(in nd, UnaryOp.Ceil, ResolveUnaryReturnType(nd, typeCode)); } } } diff --git a/src/NumSharp.Core/Backends/Default/Math/Default.Cos.cs b/src/NumSharp.Core/Backends/Default/Math/Default.Cos.cs index 59a4327d..154cd2d6 100644 --- a/src/NumSharp.Core/Backends/Default/Math/Default.Cos.cs +++ b/src/NumSharp.Core/Backends/Default/Math/Default.Cos.cs @@ -1,7 +1,5 @@ using System; -using System.Threading.Tasks; -using DecimalMath; -using NumSharp.Utilities; +using NumSharp.Backends.Kernels; namespace NumSharp.Backends { @@ -9,107 +7,12 @@ public partial class DefaultEngine { public override NDArray Cos(in NDArray nd, Type dtype) => Cos(nd, dtype?.GetTypeCode()); + /// + /// Element-wise cosine using IL-generated kernels. + /// public override NDArray Cos(in NDArray nd, NPTypeCode? typeCode = null) { - if (nd.size == 0) - return nd.Clone(); - - var @out = Cast(nd, ResolveUnaryReturnType(nd, typeCode), copy: true); - var len = @out.size; - - unsafe - { - switch (@out.GetTypeCode) - { -#if _REGEN - %foreach except(supported_numericals, "Decimal"),except(supported_numericals_lowercase, "decimal")% - case NPTypeCode.#1: - { - var out_addr = (#2*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.To#1(Math.Cos(out_addr[i])); - return @out; - } - % - case NPTypeCode.Decimal: - { - var out_addr = (decimal*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = (decimal)(Math.Cos(Converts.ToDouble(out_addr[i]))); - return @out; - } - default: - throw new NotSupportedException(); -#else - case NPTypeCode.Byte: - { - var out_addr = (byte*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToByte(Math.Cos(out_addr[i])); - return @out; - } - case NPTypeCode.Int16: - { - var out_addr = (short*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt16(Math.Cos(out_addr[i])); - return @out; - } - case NPTypeCode.UInt16: - { - var out_addr = (ushort*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt16(Math.Cos(out_addr[i])); - return @out; - } - case NPTypeCode.Int32: - { - var out_addr = (int*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt32(Math.Cos(out_addr[i])); - return @out; - } - case NPTypeCode.UInt32: - { - var out_addr = (uint*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt32(Math.Cos(out_addr[i])); - return @out; - } - case NPTypeCode.Int64: - { - var out_addr = (long*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt64(Math.Cos(out_addr[i])); - return @out; - } - case NPTypeCode.UInt64: - { - var out_addr = (ulong*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt64(Math.Cos(out_addr[i])); - return @out; - } - case NPTypeCode.Char: - { - var out_addr = (char*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToChar(Math.Cos(out_addr[i])); - return @out; - } - case NPTypeCode.Double: - { - var out_addr = (double*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToDouble(Math.Cos(out_addr[i])); - return @out; - } - case NPTypeCode.Single: - { - var out_addr = (float*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToSingle(Math.Cos(out_addr[i])); - return @out; - } - case NPTypeCode.Decimal: - { - var out_addr = (decimal*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = (decimal)(Math.Cos(Converts.ToDouble(out_addr[i]))); - return @out; - } - default: - throw new NotSupportedException(); -#endif - } - } + return ExecuteUnaryOp(in nd, UnaryOp.Cos, ResolveUnaryReturnType(nd, typeCode)); } } } diff --git a/src/NumSharp.Core/Backends/Default/Math/Default.Cosh.cs b/src/NumSharp.Core/Backends/Default/Math/Default.Cosh.cs index da404260..1959ab80 100644 --- a/src/NumSharp.Core/Backends/Default/Math/Default.Cosh.cs +++ b/src/NumSharp.Core/Backends/Default/Math/Default.Cosh.cs @@ -1,6 +1,5 @@ -using System; -using System.Threading.Tasks; -using NumSharp.Utilities; +using System; +using NumSharp.Backends.Kernels; namespace NumSharp.Backends { @@ -8,107 +7,12 @@ public partial class DefaultEngine { public override NDArray Cosh(in NDArray nd, Type dtype) => Cosh(nd, dtype?.GetTypeCode()); + /// + /// Element-wise hyperbolic cosine using IL-generated kernels. + /// public override NDArray Cosh(in NDArray nd, NPTypeCode? typeCode = null) { - if (nd.size == 0) - return nd.Clone(); - - var @out = Cast(nd, ResolveUnaryReturnType(nd, typeCode), copy: true); - var len = @out.size; - - unsafe - { - switch (@out.GetTypeCode) - { -#if _REGEN - %foreach except(supported_numericals, "Decimal"),except(supported_numericals_lowercase, "decimal")% - case NPTypeCode.#1: - { - var out_addr = (#2*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.To#1(Math.Cosh(out_addr[i])); - return @out; - } - % - case NPTypeCode.Decimal: - { - var out_addr = (decimal*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = (decimal)(Math.Cosh(Converts.ToDouble(out_addr[i]))); - return @out; - } - default: - throw new NotSupportedException(); -#else - case NPTypeCode.Byte: - { - var out_addr = (byte*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToByte(Math.Cosh(out_addr[i])); - return @out; - } - case NPTypeCode.Int16: - { - var out_addr = (short*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt16(Math.Cosh(out_addr[i])); - return @out; - } - case NPTypeCode.UInt16: - { - var out_addr = (ushort*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt16(Math.Cosh(out_addr[i])); - return @out; - } - case NPTypeCode.Int32: - { - var out_addr = (int*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt32(Math.Cosh(out_addr[i])); - return @out; - } - case NPTypeCode.UInt32: - { - var out_addr = (uint*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt32(Math.Cosh(out_addr[i])); - return @out; - } - case NPTypeCode.Int64: - { - var out_addr = (long*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt64(Math.Cosh(out_addr[i])); - return @out; - } - case NPTypeCode.UInt64: - { - var out_addr = (ulong*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt64(Math.Cosh(out_addr[i])); - return @out; - } - case NPTypeCode.Char: - { - var out_addr = (char*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToChar(Math.Cosh(out_addr[i])); - return @out; - } - case NPTypeCode.Double: - { - var out_addr = (double*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToDouble(Math.Cosh(out_addr[i])); - return @out; - } - case NPTypeCode.Single: - { - var out_addr = (float*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToSingle(Math.Cosh(out_addr[i])); - return @out; - } - case NPTypeCode.Decimal: - { - var out_addr = (decimal*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = (decimal)(Math.Cosh(Converts.ToDouble(out_addr[i]))); - return @out; - } - default: - throw new NotSupportedException(); -#endif - } - } + return ExecuteUnaryOp(in nd, UnaryOp.Cosh, ResolveUnaryReturnType(nd, typeCode)); } } } diff --git a/src/NumSharp.Core/Backends/Default/Math/Default.Divide.cs b/src/NumSharp.Core/Backends/Default/Math/Default.Divide.cs index 9412c10a..dce34d41 100644 --- a/src/NumSharp.Core/Backends/Default/Math/Default.Divide.cs +++ b/src/NumSharp.Core/Backends/Default/Math/Default.Divide.cs @@ -1,36 +1,16 @@ -using System; +using NumSharp.Backends.Kernels; namespace NumSharp.Backends { public partial class DefaultEngine { + /// + /// Element-wise division using IL-generated kernels. + /// Supports all 144 type combinations with automatic type promotion. + /// public override NDArray Divide(in NDArray lhs, in NDArray rhs) { - switch (lhs.GetTypeCode) - { -#if _REGEN - %foreach supported_dtypes,supported_dtypes_lowercase% - case NPTypeCode.#1: return Divide#1(lhs, rhs); - % - default: - throw new NotSupportedException(); -#else - case NPTypeCode.Boolean: return DivideBoolean(lhs, rhs); - case NPTypeCode.Byte: return DivideByte(lhs, rhs); - case NPTypeCode.Int16: return DivideInt16(lhs, rhs); - case NPTypeCode.UInt16: return DivideUInt16(lhs, rhs); - case NPTypeCode.Int32: return DivideInt32(lhs, rhs); - case NPTypeCode.UInt32: return DivideUInt32(lhs, rhs); - case NPTypeCode.Int64: return DivideInt64(lhs, rhs); - case NPTypeCode.UInt64: return DivideUInt64(lhs, rhs); - case NPTypeCode.Char: return DivideChar(lhs, rhs); - case NPTypeCode.Double: return DivideDouble(lhs, rhs); - case NPTypeCode.Single: return DivideSingle(lhs, rhs); - case NPTypeCode.Decimal: return DivideDecimal(lhs, rhs); - default: - throw new NotSupportedException(); -#endif - } + return ExecuteBinaryOp(in lhs, in rhs, BinaryOp.Divide); } } } diff --git a/src/NumSharp.Core/Backends/Default/Math/Default.Exp.cs b/src/NumSharp.Core/Backends/Default/Math/Default.Exp.cs index 0938c01f..764e9d2d 100644 --- a/src/NumSharp.Core/Backends/Default/Math/Default.Exp.cs +++ b/src/NumSharp.Core/Backends/Default/Math/Default.Exp.cs @@ -1,7 +1,5 @@ using System; -using System.Threading.Tasks; -using DecimalMath; -using NumSharp.Utilities; +using NumSharp.Backends.Kernels; namespace NumSharp.Backends { @@ -9,107 +7,12 @@ public partial class DefaultEngine { public override NDArray Exp(in NDArray nd, Type dtype) => Exp(nd, dtype?.GetTypeCode()); + /// + /// Element-wise exponential using IL-generated kernels. + /// public override NDArray Exp(in NDArray nd, NPTypeCode? typeCode = null) { - if (nd.size == 0) - return nd.Clone(); - - var @out = Cast(nd, ResolveUnaryReturnType(nd, typeCode), copy: true); - var len = @out.size; - - unsafe - { - switch (@out.GetTypeCode) - { -#if _REGEN - %foreach except(supported_numericals, "Decimal"),except(supported_numericals_lowercase, "decimal")% - case NPTypeCode.#1: - { - var out_addr = (#2*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.To#1(Math.Exp(out_addr[i])); - return @out; - } - % - case NPTypeCode.Decimal: - { - var out_addr = (decimal*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = (decimal)Converts.ToDouble(DecimalEx.Exp(out_addr[i])); - return @out; - } - default: - throw new NotSupportedException(); -#else - case NPTypeCode.Byte: - { - var out_addr = (byte*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToByte(Math.Exp(out_addr[i])); - return @out; - } - case NPTypeCode.Int16: - { - var out_addr = (short*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt16(Math.Exp(out_addr[i])); - return @out; - } - case NPTypeCode.UInt16: - { - var out_addr = (ushort*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt16(Math.Exp(out_addr[i])); - return @out; - } - case NPTypeCode.Int32: - { - var out_addr = (int*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt32(Math.Exp(out_addr[i])); - return @out; - } - case NPTypeCode.UInt32: - { - var out_addr = (uint*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt32(Math.Exp(out_addr[i])); - return @out; - } - case NPTypeCode.Int64: - { - var out_addr = (long*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt64(Math.Exp(out_addr[i])); - return @out; - } - case NPTypeCode.UInt64: - { - var out_addr = (ulong*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt64(Math.Exp(out_addr[i])); - return @out; - } - case NPTypeCode.Char: - { - var out_addr = (char*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToChar(Math.Exp(out_addr[i])); - return @out; - } - case NPTypeCode.Double: - { - var out_addr = (double*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToDouble(Math.Exp(out_addr[i])); - return @out; - } - case NPTypeCode.Single: - { - var out_addr = (float*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToSingle(Math.Exp(out_addr[i])); - return @out; - } - case NPTypeCode.Decimal: - { - var out_addr = (decimal*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = (decimal)Converts.ToDouble(DecimalEx.Exp(out_addr[i])); - return @out; - } - default: - throw new NotSupportedException(); -#endif - } - } + return ExecuteUnaryOp(in nd, UnaryOp.Exp, ResolveUnaryReturnType(nd, typeCode)); } } } diff --git a/src/NumSharp.Core/Backends/Default/Math/Default.Exp2.cs b/src/NumSharp.Core/Backends/Default/Math/Default.Exp2.cs index 44e5b0b5..c7c94b72 100644 --- a/src/NumSharp.Core/Backends/Default/Math/Default.Exp2.cs +++ b/src/NumSharp.Core/Backends/Default/Math/Default.Exp2.cs @@ -1,7 +1,5 @@ -using System; -using System.Threading.Tasks; -using DecimalMath; -using NumSharp.Utilities; +using System; +using NumSharp.Backends.Kernels; namespace NumSharp.Backends { @@ -9,110 +7,12 @@ public partial class DefaultEngine { public override NDArray Exp2(in NDArray nd, Type dtype) => Exp2(nd, dtype?.GetTypeCode()); + /// + /// Element-wise 2^x using IL-generated kernels. + /// public override NDArray Exp2(in NDArray nd, NPTypeCode? typeCode = null) { - - - if (nd.size == 0) - return nd.Clone(); - - var @out = Cast(nd, typeCode ?? nd.typecode, copy: true); - var len = @out.size; - - unsafe - { - switch (@out.GetTypeCode) - { -#if _REGEN - - %foreach except(supported_numericals, "Decimal"),except(supported_numericals_lowercase, "decimal")% - case NPTypeCode.#1: - { - var out_addr = (#2*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.To#1(Math.Pow(2, out_addr[i])); - return @out; - } - % - case NPTypeCode.Decimal: - { - var out_addr = (decimal*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = DecimalEx.Pow(2, out_addr[i]); - return @out; - } - default: - throw new NotSupportedException(); -#else - case NPTypeCode.Byte: - { - var out_addr = (byte*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToByte(Math.Pow(2, out_addr[i])); - return @out; - } - case NPTypeCode.Int16: - { - var out_addr = (short*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt16(Math.Pow(2, out_addr[i])); - return @out; - } - case NPTypeCode.UInt16: - { - var out_addr = (ushort*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt16(Math.Pow(2, out_addr[i])); - return @out; - } - case NPTypeCode.Int32: - { - var out_addr = (int*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt32(Math.Pow(2, out_addr[i])); - return @out; - } - case NPTypeCode.UInt32: - { - var out_addr = (uint*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt32(Math.Pow(2, out_addr[i])); - return @out; - } - case NPTypeCode.Int64: - { - var out_addr = (long*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt64(Math.Pow(2, out_addr[i])); - return @out; - } - case NPTypeCode.UInt64: - { - var out_addr = (ulong*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt64(Math.Pow(2, out_addr[i])); - return @out; - } - case NPTypeCode.Char: - { - var out_addr = (char*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToChar(Math.Pow(2, out_addr[i])); - return @out; - } - case NPTypeCode.Double: - { - var out_addr = (double*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToDouble(Math.Pow(2, out_addr[i])); - return @out; - } - case NPTypeCode.Single: - { - var out_addr = (float*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToSingle(Math.Pow(2, out_addr[i])); - return @out; - } - case NPTypeCode.Decimal: - { - var out_addr = (decimal*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = DecimalEx.Pow(2, out_addr[i]); - return @out; - } - default: - throw new NotSupportedException(); -#endif - } - } + return ExecuteUnaryOp(in nd, UnaryOp.Exp2, ResolveUnaryReturnType(nd, typeCode)); } } } diff --git a/src/NumSharp.Core/Backends/Default/Math/Default.Expm1.cs b/src/NumSharp.Core/Backends/Default/Math/Default.Expm1.cs index e70d0611..45e16255 100644 --- a/src/NumSharp.Core/Backends/Default/Math/Default.Expm1.cs +++ b/src/NumSharp.Core/Backends/Default/Math/Default.Expm1.cs @@ -1,7 +1,5 @@ -using System; -using System.Threading.Tasks; -using DecimalMath; -using NumSharp.Utilities; +using System; +using NumSharp.Backends.Kernels; namespace NumSharp.Backends { @@ -9,107 +7,12 @@ public partial class DefaultEngine { public override NDArray Expm1(in NDArray nd, Type dtype) => Expm1(nd, dtype?.GetTypeCode()); + /// + /// Element-wise exp(x) - 1 using IL-generated kernels. + /// public override NDArray Expm1(in NDArray nd, NPTypeCode? typeCode = null) { - if (nd.size == 0) - return nd.Clone(); - - var @out = Cast(nd, ResolveUnaryReturnType(nd, typeCode), copy: true); - var len = @out.size; - - unsafe - { - switch (@out.GetTypeCode) - { -#if _REGEN - %foreach except(supported_numericals, "Decimal"),except(supported_numericals_lowercase, "decimal")% - case NPTypeCode.#1: - { - var out_addr = (#2*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.To#1(Math.Exp(out_addr[i]) - 1); - return @out; - } - % - case NPTypeCode.Decimal: - { - var out_addr = (decimal*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = (decimal)Converts.ToDouble(DecimalEx.Exp(out_addr[i]) - 1m); - return @out; - } - default: - throw new NotSupportedException(); -#else - case NPTypeCode.Byte: - { - var out_addr = (byte*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToByte(Math.Exp(out_addr[i]) - 1); - return @out; - } - case NPTypeCode.Int16: - { - var out_addr = (short*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt16(Math.Exp(out_addr[i]) - 1); - return @out; - } - case NPTypeCode.UInt16: - { - var out_addr = (ushort*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt16(Math.Exp(out_addr[i]) - 1); - return @out; - } - case NPTypeCode.Int32: - { - var out_addr = (int*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt32(Math.Exp(out_addr[i]) - 1); - return @out; - } - case NPTypeCode.UInt32: - { - var out_addr = (uint*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt32(Math.Exp(out_addr[i]) - 1); - return @out; - } - case NPTypeCode.Int64: - { - var out_addr = (long*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt64(Math.Exp(out_addr[i]) - 1); - return @out; - } - case NPTypeCode.UInt64: - { - var out_addr = (ulong*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt64(Math.Exp(out_addr[i]) - 1); - return @out; - } - case NPTypeCode.Char: - { - var out_addr = (char*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToChar(Math.Exp(out_addr[i]) - 1); - return @out; - } - case NPTypeCode.Double: - { - var out_addr = (double*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToDouble(Math.Exp(out_addr[i]) - 1); - return @out; - } - case NPTypeCode.Single: - { - var out_addr = (float*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToSingle(Math.Exp(out_addr[i]) - 1); - return @out; - } - case NPTypeCode.Decimal: - { - var out_addr = (decimal*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = (decimal)Converts.ToDouble(DecimalEx.Exp(out_addr[i]) - 1m); - return @out; - } - default: - throw new NotSupportedException(); -#endif - } - } + return ExecuteUnaryOp(in nd, UnaryOp.Expm1, ResolveUnaryReturnType(nd, typeCode)); } } } diff --git a/src/NumSharp.Core/Backends/Default/Math/Default.Floor.cs b/src/NumSharp.Core/Backends/Default/Math/Default.Floor.cs index 9b7c2a09..a4ae2b13 100644 --- a/src/NumSharp.Core/Backends/Default/Math/Default.Floor.cs +++ b/src/NumSharp.Core/Backends/Default/Math/Default.Floor.cs @@ -1,7 +1,5 @@ -using System; -using System.Threading.Tasks; -using DecimalMath; -using NumSharp.Utilities; +using System; +using NumSharp.Backends.Kernels; namespace NumSharp.Backends { @@ -9,59 +7,12 @@ public partial class DefaultEngine { public override NDArray Floor(in NDArray nd, Type dtype) => Floor(nd, dtype?.GetTypeCode()); + /// + /// Element-wise floor using IL-generated kernels. + /// public override NDArray Floor(in NDArray nd, NPTypeCode? typeCode = null) { - if (nd.size == 0) - return nd.Clone(); - - var @out = Cast(nd, ResolveUnaryReturnType(nd, typeCode), copy: true); - var len = @out.size; - - unsafe - { - switch (@out.GetTypeCode) - { -#if _REGEN - %foreach except(supported_numericals, "Decimal"),except(supported_numericals_lowercase, "decimal")% - case NPTypeCode.#1: - { - var out_addr = (#2*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.To#1(Math.Floor(out_addr[i])); - return @out; - } - % - case NPTypeCode.Decimal: - { - var out_addr = (decimal*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = (DecimalEx.Floor(out_addr[i])); - return @out; - } - default: - throw new NotSupportedException(); -#else - case NPTypeCode.Double: - { - var out_addr = (double*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToDouble(Math.Floor(out_addr[i])); - return @out; - } - case NPTypeCode.Single: - { - var out_addr = (float*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToSingle(Math.Floor(out_addr[i])); - return @out; - } - case NPTypeCode.Decimal: - { - var out_addr = (decimal*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = (DecimalEx.Floor(out_addr[i])); - return @out; - } - default: - throw new NotSupportedException(); -#endif - } - } + return ExecuteUnaryOp(in nd, UnaryOp.Floor, ResolveUnaryReturnType(nd, typeCode)); } } } diff --git a/src/NumSharp.Core/Backends/Default/Math/Default.Log.cs b/src/NumSharp.Core/Backends/Default/Math/Default.Log.cs index 21f5b929..2c5167dd 100644 --- a/src/NumSharp.Core/Backends/Default/Math/Default.Log.cs +++ b/src/NumSharp.Core/Backends/Default/Math/Default.Log.cs @@ -1,7 +1,5 @@ using System; -using DecimalMath; -using NumSharp.Utilities; -using System.Threading.Tasks; +using NumSharp.Backends.Kernels; namespace NumSharp.Backends { @@ -9,107 +7,12 @@ public partial class DefaultEngine { public override NDArray Log(in NDArray nd, Type dtype) => Log(nd, dtype?.GetTypeCode()); + /// + /// Element-wise natural logarithm using IL-generated kernels. + /// public override NDArray Log(in NDArray nd, NPTypeCode? typeCode = null) { - if (nd.size == 0) - return nd.Clone(); - - var @out = Cast(nd, ResolveUnaryReturnType(nd, typeCode), copy: true); - var len = @out.size; - - unsafe - { - switch (@out.GetTypeCode) - { -#if _REGEN - %foreach except(supported_numericals, "Decimal"),except(supported_numericals_lowercase, "decimal")% - case NPTypeCode.#1: - { - var out_addr = (#2*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.To#1(Math.Log(out_addr[i])); - return @out; - } - % - case NPTypeCode.Decimal: - { - var out_addr = (decimal*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = (DecimalEx.Log(out_addr[i])); - return @out; - } - default: - throw new NotSupportedException(); -#else - case NPTypeCode.Byte: - { - var out_addr = (byte*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToByte(Math.Log(out_addr[i])); - return @out; - } - case NPTypeCode.Int16: - { - var out_addr = (short*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt16(Math.Log(out_addr[i])); - return @out; - } - case NPTypeCode.UInt16: - { - var out_addr = (ushort*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt16(Math.Log(out_addr[i])); - return @out; - } - case NPTypeCode.Int32: - { - var out_addr = (int*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt32(Math.Log(out_addr[i])); - return @out; - } - case NPTypeCode.UInt32: - { - var out_addr = (uint*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt32(Math.Log(out_addr[i])); - return @out; - } - case NPTypeCode.Int64: - { - var out_addr = (long*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt64(Math.Log(out_addr[i])); - return @out; - } - case NPTypeCode.UInt64: - { - var out_addr = (ulong*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt64(Math.Log(out_addr[i])); - return @out; - } - case NPTypeCode.Char: - { - var out_addr = (char*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToChar(Math.Log(out_addr[i])); - return @out; - } - case NPTypeCode.Double: - { - var out_addr = (double*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToDouble(Math.Log(out_addr[i])); - return @out; - } - case NPTypeCode.Single: - { - var out_addr = (float*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToSingle(Math.Log(out_addr[i])); - return @out; - } - case NPTypeCode.Decimal: - { - var out_addr = (decimal*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = (DecimalEx.Log(out_addr[i])); - return @out; - } - default: - throw new NotSupportedException(); -#endif - } - } + return ExecuteUnaryOp(in nd, UnaryOp.Log, ResolveUnaryReturnType(nd, typeCode)); } } } diff --git a/src/NumSharp.Core/Backends/Default/Math/Default.Log10.cs b/src/NumSharp.Core/Backends/Default/Math/Default.Log10.cs index 703044b7..f486446e 100644 --- a/src/NumSharp.Core/Backends/Default/Math/Default.Log10.cs +++ b/src/NumSharp.Core/Backends/Default/Math/Default.Log10.cs @@ -1,7 +1,5 @@ -using System; -using DecimalMath; -using NumSharp.Utilities; -using System.Threading.Tasks; +using System; +using NumSharp.Backends.Kernels; namespace NumSharp.Backends { @@ -9,107 +7,12 @@ public partial class DefaultEngine { public override NDArray Log10(in NDArray nd, Type dtype) => Log10(nd, dtype?.GetTypeCode()); + /// + /// Element-wise log base 10 using IL-generated kernels. + /// public override NDArray Log10(in NDArray nd, NPTypeCode? typeCode = null) { - if (nd.size == 0) - return nd.Clone(); - - var @out = Cast(nd, ResolveUnaryReturnType(nd, typeCode), copy: true); - var len = @out.size; - - unsafe - { - switch (@out.GetTypeCode) - { -#if _REGEN - %foreach except(supported_numericals, "Decimal"),except(supported_numericals_lowercase, "decimal")% - case NPTypeCode.#1: - { - var out_addr = (#2*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.To#1(Math.Log10(out_addr[i])); - return @out; - } - % - case NPTypeCode.Decimal: - { - var out_addr = (decimal*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = (DecimalEx.Log10(out_addr[i])); - return @out; - } - default: - throw new NotSupportedException(); -#else - case NPTypeCode.Byte: - { - var out_addr = (byte*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToByte(Math.Log10(out_addr[i])); - return @out; - } - case NPTypeCode.Int16: - { - var out_addr = (short*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt16(Math.Log10(out_addr[i])); - return @out; - } - case NPTypeCode.UInt16: - { - var out_addr = (ushort*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt16(Math.Log10(out_addr[i])); - return @out; - } - case NPTypeCode.Int32: - { - var out_addr = (int*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt32(Math.Log10(out_addr[i])); - return @out; - } - case NPTypeCode.UInt32: - { - var out_addr = (uint*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt32(Math.Log10(out_addr[i])); - return @out; - } - case NPTypeCode.Int64: - { - var out_addr = (long*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt64(Math.Log10(out_addr[i])); - return @out; - } - case NPTypeCode.UInt64: - { - var out_addr = (ulong*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt64(Math.Log10(out_addr[i])); - return @out; - } - case NPTypeCode.Char: - { - var out_addr = (char*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToChar(Math.Log10(out_addr[i])); - return @out; - } - case NPTypeCode.Double: - { - var out_addr = (double*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToDouble(Math.Log10(out_addr[i])); - return @out; - } - case NPTypeCode.Single: - { - var out_addr = (float*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToSingle(Math.Log10(out_addr[i])); - return @out; - } - case NPTypeCode.Decimal: - { - var out_addr = (decimal*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = (DecimalEx.Log10(out_addr[i])); - return @out; - } - default: - throw new NotSupportedException(); -#endif - } - } + return ExecuteUnaryOp(in nd, UnaryOp.Log10, ResolveUnaryReturnType(nd, typeCode)); } } } diff --git a/src/NumSharp.Core/Backends/Default/Math/Default.Log1p.cs b/src/NumSharp.Core/Backends/Default/Math/Default.Log1p.cs index 48b46ced..b059a844 100644 --- a/src/NumSharp.Core/Backends/Default/Math/Default.Log1p.cs +++ b/src/NumSharp.Core/Backends/Default/Math/Default.Log1p.cs @@ -1,115 +1,18 @@ -using System; -using DecimalMath; -using NumSharp.Utilities; -using System.Threading.Tasks; +using System; +using NumSharp.Backends.Kernels; namespace NumSharp.Backends { public partial class DefaultEngine { - public override NDArray Log1p(in NDArray nd, Type dtype) => Log10(nd, dtype?.GetTypeCode()); + public override NDArray Log1p(in NDArray nd, Type dtype) => Log1p(nd, dtype?.GetTypeCode()); + /// + /// Element-wise log(1 + x) using IL-generated kernels. + /// public override NDArray Log1p(in NDArray nd, NPTypeCode? typeCode = null) { - if (nd.size == 0) - return nd.Clone(); - - var @out = Cast(nd, ResolveUnaryReturnType(nd, typeCode), copy: true); - var len = @out.size; - - unsafe - { - switch (@out.GetTypeCode) - { -#if _REGEN - %foreach except(supported_numericals, "Decimal"),except(supported_numericals_lowercase, "decimal"), except(supported_numericals_onevales, "1m")% - case NPTypeCode.#1: - { - var out_addr = (#2*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.To#1(Math.Log10(out_addr[i] + #3)); - return @out; - } - % - case NPTypeCode.Decimal: - { - var out_addr = (decimal*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = (DecimalEx.Log10(out_addr[i] + 1m)); - return @out; - } - default: - throw new NotSupportedException(); -#else - case NPTypeCode.Byte: - { - var out_addr = (byte*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToByte(Math.Log10(out_addr[i] + 1)); - return @out; - } - case NPTypeCode.Int16: - { - var out_addr = (short*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt16(Math.Log10(out_addr[i] + 1)); - return @out; - } - case NPTypeCode.UInt16: - { - var out_addr = (ushort*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt16(Math.Log10(out_addr[i] + 1)); - return @out; - } - case NPTypeCode.Int32: - { - var out_addr = (int*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt32(Math.Log10(out_addr[i] + 1)); - return @out; - } - case NPTypeCode.UInt32: - { - var out_addr = (uint*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt32(Math.Log10(out_addr[i] + 1u)); - return @out; - } - case NPTypeCode.Int64: - { - var out_addr = (long*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt64(Math.Log10(out_addr[i] + 1L)); - return @out; - } - case NPTypeCode.UInt64: - { - var out_addr = (ulong*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt64(Math.Log10(out_addr[i] + 1UL)); - return @out; - } - case NPTypeCode.Char: - { - var out_addr = (char*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToChar(Math.Log10(out_addr[i] + 1)); - return @out; - } - case NPTypeCode.Double: - { - var out_addr = (double*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToDouble(Math.Log10(out_addr[i] + 1d)); - return @out; - } - case NPTypeCode.Single: - { - var out_addr = (float*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToSingle(Math.Log10(out_addr[i] + 1f)); - return @out; - } - case NPTypeCode.Decimal: - { - var out_addr = (decimal*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = (DecimalEx.Log10(out_addr[i] + 1m)); - return @out; - } - default: - throw new NotSupportedException(); -#endif - } - } + return ExecuteUnaryOp(in nd, UnaryOp.Log1p, ResolveUnaryReturnType(nd, typeCode)); } } } diff --git a/src/NumSharp.Core/Backends/Default/Math/Default.Log2.cs b/src/NumSharp.Core/Backends/Default/Math/Default.Log2.cs index 8adc0a5f..ce5a569d 100644 --- a/src/NumSharp.Core/Backends/Default/Math/Default.Log2.cs +++ b/src/NumSharp.Core/Backends/Default/Math/Default.Log2.cs @@ -1,7 +1,5 @@ -using System; -using DecimalMath; -using NumSharp.Utilities; -using System.Threading.Tasks; +using System; +using NumSharp.Backends.Kernels; namespace NumSharp.Backends { @@ -9,107 +7,12 @@ public partial class DefaultEngine { public override NDArray Log2(in NDArray nd, Type dtype) => Log2(nd, dtype?.GetTypeCode()); + /// + /// Element-wise log base 2 using IL-generated kernels. + /// public override NDArray Log2(in NDArray nd, NPTypeCode? typeCode = null) { - if (nd.size == 0) - return nd.Clone(); - - var @out = Cast(nd, ResolveUnaryReturnType(nd, typeCode), copy: true); - var len = @out.size; - - unsafe - { - switch (@out.GetTypeCode) - { -#if _REGEN - %foreach except(supported_numericals, "Decimal"),except(supported_numericals_lowercase, "decimal")% - case NPTypeCode.#1: - { - var out_addr = (#2*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.To#1(Math.Log(out_addr[i], 2)); - return @out; - } - % - case NPTypeCode.Decimal: - { - var out_addr = (decimal*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = (DecimalEx.Log(out_addr[i], 2)); - return @out; - } - default: - throw new NotSupportedException(); -#else - case NPTypeCode.Byte: - { - var out_addr = (byte*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToByte(Math.Log(out_addr[i], 2)); - return @out; - } - case NPTypeCode.Int16: - { - var out_addr = (short*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt16(Math.Log(out_addr[i], 2)); - return @out; - } - case NPTypeCode.UInt16: - { - var out_addr = (ushort*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt16(Math.Log(out_addr[i], 2)); - return @out; - } - case NPTypeCode.Int32: - { - var out_addr = (int*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt32(Math.Log(out_addr[i], 2)); - return @out; - } - case NPTypeCode.UInt32: - { - var out_addr = (uint*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt32(Math.Log(out_addr[i], 2)); - return @out; - } - case NPTypeCode.Int64: - { - var out_addr = (long*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt64(Math.Log(out_addr[i], 2)); - return @out; - } - case NPTypeCode.UInt64: - { - var out_addr = (ulong*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt64(Math.Log(out_addr[i], 2)); - return @out; - } - case NPTypeCode.Char: - { - var out_addr = (char*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToChar(Math.Log(out_addr[i], 2)); - return @out; - } - case NPTypeCode.Double: - { - var out_addr = (double*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToDouble(Math.Log(out_addr[i], 2)); - return @out; - } - case NPTypeCode.Single: - { - var out_addr = (float*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToSingle(Math.Log(out_addr[i], 2)); - return @out; - } - case NPTypeCode.Decimal: - { - var out_addr = (decimal*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = (DecimalEx.Log(out_addr[i], 2)); - return @out; - } - default: - throw new NotSupportedException(); -#endif - } - } + return ExecuteUnaryOp(in nd, UnaryOp.Log2, ResolveUnaryReturnType(nd, typeCode)); } } } diff --git a/src/NumSharp.Core/Backends/Default/Math/Default.Mod.cs b/src/NumSharp.Core/Backends/Default/Math/Default.Mod.cs index 492841ba..2bec5f1d 100644 --- a/src/NumSharp.Core/Backends/Default/Math/Default.Mod.cs +++ b/src/NumSharp.Core/Backends/Default/Math/Default.Mod.cs @@ -1,36 +1,16 @@ -using System; +using NumSharp.Backends.Kernels; namespace NumSharp.Backends { public partial class DefaultEngine { + /// + /// Element-wise modulo using IL-generated kernels. + /// Supports all 144 type combinations with automatic type promotion. + /// public override NDArray Mod(in NDArray lhs, in NDArray rhs) { - switch (lhs.GetTypeCode) - { -#if _REGEN - %foreach supported_dtypes,supported_dtypes_lowercase% - case NPTypeCode.#1: return Mod#1(lhs, rhs); - % - default: - throw new NotSupportedException(); -#else - case NPTypeCode.Boolean: return ModBoolean(lhs, rhs); - case NPTypeCode.Byte: return ModByte(lhs, rhs); - case NPTypeCode.Int16: return ModInt16(lhs, rhs); - case NPTypeCode.UInt16: return ModUInt16(lhs, rhs); - case NPTypeCode.Int32: return ModInt32(lhs, rhs); - case NPTypeCode.UInt32: return ModUInt32(lhs, rhs); - case NPTypeCode.Int64: return ModInt64(lhs, rhs); - case NPTypeCode.UInt64: return ModUInt64(lhs, rhs); - case NPTypeCode.Char: return ModChar(lhs, rhs); - case NPTypeCode.Double: return ModDouble(lhs, rhs); - case NPTypeCode.Single: return ModSingle(lhs, rhs); - case NPTypeCode.Decimal: return ModDecimal(lhs, rhs); - default: - throw new NotSupportedException(); -#endif - } + return ExecuteBinaryOp(in lhs, in rhs, BinaryOp.Mod); } } } diff --git a/src/NumSharp.Core/Backends/Default/Math/Default.Multiply.cs b/src/NumSharp.Core/Backends/Default/Math/Default.Multiply.cs index 94541179..2de01b57 100644 --- a/src/NumSharp.Core/Backends/Default/Math/Default.Multiply.cs +++ b/src/NumSharp.Core/Backends/Default/Math/Default.Multiply.cs @@ -1,37 +1,16 @@ -using System; +using NumSharp.Backends.Kernels; namespace NumSharp.Backends { public partial class DefaultEngine { + /// + /// Element-wise multiplication using IL-generated kernels. + /// Supports all 144 type combinations with automatic type promotion. + /// public override NDArray Multiply(NDArray lhs, NDArray rhs) { - switch (lhs.GetTypeCode) - { -#if _REGEN - %foreach supported_dtypes,supported_dtypes_lowercase% - case NPTypeCode.#1: return Multiply#1(lhs, rhs); - % - default: - throw new NotSupportedException(); -#else - case NPTypeCode.Boolean: return MultiplyBoolean(lhs, rhs); - case NPTypeCode.Byte: return MultiplyByte(lhs, rhs); - case NPTypeCode.Int16: return MultiplyInt16(lhs, rhs); - case NPTypeCode.UInt16: return MultiplyUInt16(lhs, rhs); - case NPTypeCode.Int32: return MultiplyInt32(lhs, rhs); - case NPTypeCode.UInt32: return MultiplyUInt32(lhs, rhs); - case NPTypeCode.Int64: return MultiplyInt64(lhs, rhs); - case NPTypeCode.UInt64: return MultiplyUInt64(lhs, rhs); - case NPTypeCode.Char: return MultiplyChar(lhs, rhs); - case NPTypeCode.Double: return MultiplyDouble(lhs, rhs); - case NPTypeCode.Single: return MultiplySingle(lhs, rhs); - case NPTypeCode.Decimal: return MultiplyDecimal(lhs, rhs); - default: - throw new NotSupportedException(); -#endif - } - + return ExecuteBinaryOp(in lhs, in rhs, BinaryOp.Multiply); } } } diff --git a/src/NumSharp.Core/Backends/Default/Math/Default.Negate.cs b/src/NumSharp.Core/Backends/Default/Math/Default.Negate.cs index 776cd5ed..ffd5961b 100644 --- a/src/NumSharp.Core/Backends/Default/Math/Default.Negate.cs +++ b/src/NumSharp.Core/Backends/Default/Math/Default.Negate.cs @@ -1,235 +1,40 @@ -using System; -using NumSharp.Utilities; +using NumSharp.Backends.Kernels; namespace NumSharp.Backends { public partial class DefaultEngine { + /// + /// Element-wise negation using IL-generated kernels. + /// public override NDArray Negate(in NDArray nd) { - if (nd.size == 0) - return nd.Clone(); //return new to maintain immutability. - - var @out = new NDArray(nd.dtype, nd.Shape, false); - unsafe + // Boolean negation is logical NOT, not arithmetic negation + if (nd.GetTypeCode == NPTypeCode.Boolean) { - switch (nd.GetTypeCode) - { - case NPTypeCode.Boolean: - { - var out_addr = (bool*)@out.Address; - var addr = (bool*)nd.Address; - var len = nd.size; - for (int i = 0; i < len; i++) - out_addr[i] = !addr[i]; - return @out; - } -#if _REGEN - %foreach supported_numericals_unsigned,supported_numericals_unsigned_lowercase,supported_numericals_unsigned_defaultvals% - case NPTypeCode.#1: - { - var out_addr = (#2*)@out.Address; - var addr = (#2*)nd.Address; - var len = nd.size; - - for (int i = 0; i < len; i++) - { - var val = addr[i]; - if (val == #3) - out_addr[i] = #3; - else - out_addr[i] = Converts.To#1(~val+1); - } - - return @out; - } - % - %foreach supported_numericals_signed,supported_numericals_signed_lowercase% - case NPTypeCode.#1: - { - var out_addr = (#2*)@out.Address; - var addr = (#2*)nd.Address; - var len = nd.size; - - for (int i = 0; i < len; i++) - out_addr[i] = Converts.To#1(-addr[i]); - - return @out; - } - % - default: - throw new NotSupportedException(); -#else - case NPTypeCode.Byte: - { - var out_addr = (byte*)@out.Address; - var addr = (byte*)nd.Address; - var len = nd.size; - - for (int i = 0; i < len; i++) - { - var val = addr[i]; - if (val == 0) - out_addr[i] = 0; - else - out_addr[i] = Converts.ToByte(~val + 1); - } - - return @out; - } - - case NPTypeCode.UInt16: - { - var out_addr = (ushort*)@out.Address; - var addr = (ushort*)nd.Address; - var len = nd.size; - - for (int i = 0; i < len; i++) - { - var val = addr[i]; - if (val == 0) - out_addr[i] = 0; - else - out_addr[i] = Converts.ToUInt16(~val + 1); - } - - return @out; - } - - case NPTypeCode.UInt32: - { - var out_addr = (uint*)@out.Address; - var addr = (uint*)nd.Address; - var len = nd.size; - - for (int i = 0; i < len; i++) - { - var val = addr[i]; - if (val == 0U) - out_addr[i] = 0U; - else - out_addr[i] = Converts.ToUInt32(~val + 1); - } - - return @out; - } - - case NPTypeCode.UInt64: - { - var out_addr = (ulong*)@out.Address; - var addr = (ulong*)nd.Address; - var len = nd.size; - - for (int i = 0; i < len; i++) - { - var val = addr[i]; - if (val == 0UL) - out_addr[i] = 0UL; - else - out_addr[i] = Converts.ToUInt64(~val + 1); - } - - return @out; - } - - case NPTypeCode.Char: - { - var out_addr = (char*)@out.Address; - var addr = (char*)nd.Address; - var len = nd.size; - - for (int i = 0; i < len; i++) - { - var val = addr[i]; - if (val == '\0') - out_addr[i] = '\0'; - else - out_addr[i] = Converts.ToChar(~val + 1); - } - - return @out; - } - - case NPTypeCode.Int16: - { - var out_addr = (short*)@out.Address; - var addr = (short*)nd.Address; - var len = nd.size; - - for (int i = 0; i < len; i++) - out_addr[i] = Converts.ToInt16(-addr[i]); - - return @out; - } - - case NPTypeCode.Int32: - { - var out_addr = (int*)@out.Address; - var addr = (int*)nd.Address; - var len = nd.size; - - for (int i = 0; i < len; i++) - out_addr[i] = Converts.ToInt32(-addr[i]); - - return @out; - } - - case NPTypeCode.Int64: - { - var out_addr = (long*)@out.Address; - var addr = (long*)nd.Address; - var len = nd.size; - - for (int i = 0; i < len; i++) - out_addr[i] = Converts.ToInt64(-addr[i]); - - return @out; - } - - case NPTypeCode.Double: - { - var out_addr = (double*)@out.Address; - var addr = (double*)nd.Address; - var len = nd.size; - - for (int i = 0; i < len; i++) - out_addr[i] = Converts.ToDouble(-addr[i]); - - return @out; - } - - case NPTypeCode.Single: - { - var out_addr = (float*)@out.Address; - var addr = (float*)nd.Address; - var len = nd.size; - - for (int i = 0; i < len; i++) - out_addr[i] = Converts.ToSingle(-addr[i]); - - return @out; - } - - case NPTypeCode.Decimal: - { - var out_addr = (decimal*)@out.Address; - var addr = (decimal*)nd.Address; - var len = nd.size; + return NegateBoolean(nd); + } - for (int i = 0; i < len; i++) - out_addr[i] = Converts.ToDecimal(-addr[i]); + return ExecuteUnaryOp(in nd, UnaryOp.Negate); + } - return @out; - } + /// + /// Boolean negation (logical NOT). + /// + private unsafe NDArray NegateBoolean(in NDArray nd) + { + if (nd.size == 0) + return nd.Clone(); - default: - throw new NotSupportedException(); -#endif - } - } + var result = new NDArray(nd.dtype, nd.Shape.Clean(), false); + var outAddr = (bool*)result.Address; + var inAddr = (bool*)nd.Address; + var len = nd.size; + for (int i = 0; i < len; i++) + outAddr[i] = !inAddr[i]; - return @out; + return result; } } } diff --git a/src/NumSharp.Core/Backends/Default/Math/Default.Round.cs b/src/NumSharp.Core/Backends/Default/Math/Default.Round.cs index c4689bc0..d7ffc522 100644 --- a/src/NumSharp.Core/Backends/Default/Math/Default.Round.cs +++ b/src/NumSharp.Core/Backends/Default/Math/Default.Round.cs @@ -1,6 +1,5 @@ -using System; -using System.Threading.Tasks; -using DecimalMath; +using System; +using NumSharp.Backends.Kernels; using NumSharp.Utilities; namespace NumSharp.Backends @@ -11,61 +10,18 @@ public partial class DefaultEngine public override NDArray Round(in NDArray nd, int decimals, Type dtype) => Round(nd, decimals, dtype?.GetTypeCode()); + /// + /// Element-wise round using IL-generated kernels. + /// public override NDArray Round(in NDArray nd, NPTypeCode? typeCode = null) { - if (nd.size == 0) - return nd.Clone(); - - var @out = Cast(nd, ResolveUnaryReturnType(nd, typeCode), copy: true); - var len = @out.size; - - unsafe - { - switch (@out.GetTypeCode) - { -#if _REGEN - %foreach except(supported_numericals, "Decimal"),except(supported_numericals_lowercase, "decimal")% - case NPTypeCode.#1: - { - var out_addr = (#2*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.To#1(Math.Round(out_addr[i])); - return @out; - } - % - case NPTypeCode.Decimal: - { - var out_addr = (decimal*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = (DecimalEx.Round(out_addr[i])); - return @out; - } - default: - throw new NotSupportedException(); -#else - case NPTypeCode.Double: - { - var out_addr = (double*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToDouble(Math.Round(out_addr[i])); - return @out; - } - case NPTypeCode.Single: - { - var out_addr = (float*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToSingle(Math.Round(out_addr[i])); - return @out; - } - case NPTypeCode.Decimal: - { - var out_addr = (decimal*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = (decimal.Round(out_addr[i])); - return @out; - } - default: - throw new NotSupportedException(); -#endif - } - } + return ExecuteUnaryOp(in nd, UnaryOp.Round, ResolveUnaryReturnType(nd, typeCode)); } + /// + /// Element-wise round with specified decimal places. + /// Note: This overload uses traditional loop implementation for precision control. + /// public override NDArray Round(in NDArray nd, int decimals, NPTypeCode? typeCode = null) { if (nd.size == 0) @@ -78,45 +34,27 @@ public override NDArray Round(in NDArray nd, int decimals, NPTypeCode? typeCode { switch (@out.GetTypeCode) { -#if _REGEN - %foreach except(supported_numericals, "Decimal"),except(supported_numericals_lowercase, "decimal")% - case NPTypeCode.#1: - { - var out_addr = (#2*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.To#1(Math.Round(out_addr[i], decimals)); + case NPTypeCode.Double: + { + var out_addr = (double*)@out.Address; + for (int i = 0; i < len; i++) out_addr[i] = Math.Round(out_addr[i], decimals); + return @out; + } + case NPTypeCode.Single: + { + var out_addr = (float*)@out.Address; + for (int i = 0; i < len; i++) out_addr[i] = (float)Math.Round(out_addr[i], decimals); return @out; - } - % + } case NPTypeCode.Decimal: - { + { var out_addr = (decimal*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = (DecimalEx.Round(out_addr[i], decimals)); + for (int i = 0; i < len; i++) out_addr[i] = decimal.Round(out_addr[i], decimals); return @out; - } - default: - throw new NotSupportedException(); -#else - case NPTypeCode.Double: - { - var out_addr = (double*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToDouble(Math.Round(out_addr[i], decimals)); - return @out; - } - case NPTypeCode.Single: - { - var out_addr = (float*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToSingle(Math.Round(out_addr[i], decimals)); - return @out; - } - case NPTypeCode.Decimal: - { - var out_addr = (decimal*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = (decimal.Round(out_addr[i], decimals)); - return @out; - } + } default: - throw new NotSupportedException(); -#endif + // For integer types, rounding with decimals has no effect + return @out; } } } diff --git a/src/NumSharp.Core/Backends/Default/Math/Default.Sign.cs b/src/NumSharp.Core/Backends/Default/Math/Default.Sign.cs index 865d5881..ca38434f 100644 --- a/src/NumSharp.Core/Backends/Default/Math/Default.Sign.cs +++ b/src/NumSharp.Core/Backends/Default/Math/Default.Sign.cs @@ -1,6 +1,5 @@ -using System; -using System.Threading.Tasks; -using NumSharp.Utilities; +using System; +using NumSharp.Backends.Kernels; namespace NumSharp.Backends { @@ -8,107 +7,13 @@ public partial class DefaultEngine { public override NDArray Sign(in NDArray nd, Type dtype) => Sign(nd, dtype?.GetTypeCode()); + /// + /// Element-wise sign function using IL-generated kernels. + /// Returns -1, 0, or 1 based on input sign. + /// public override NDArray Sign(in NDArray nd, NPTypeCode? typeCode = null) { - if (nd.size == 0) - return nd.Clone(); - - var @out = Cast(nd, ResolveUnaryReturnType(nd, typeCode), copy: true); - var len = @out.size; - - unsafe - { - switch (@out.GetTypeCode) - { -#if _REGEN - %foreach except(supported_numericals, "Decimal"),except(supported_numericals_lowercase, "decimal")% - case NPTypeCode.#1: - { - var out_addr = (#2*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.To#1(Math.Sign(out_addr[i])); - return @out; - } - % - case NPTypeCode.Decimal: - { - var out_addr = (decimal*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = (decimal)(Math.Sign(Converts.ToDouble(out_addr[i]))); - return @out; - } - default: - throw new NotSupportedException(); -#else - case NPTypeCode.Byte: - { - var out_addr = (byte*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToByte(Math.Sign(out_addr[i])); - return @out; - } - case NPTypeCode.Int16: - { - var out_addr = (short*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt16(Math.Sign(out_addr[i])); - return @out; - } - case NPTypeCode.UInt16: - { - var out_addr = (ushort*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt16(Math.Sign(out_addr[i])); - return @out; - } - case NPTypeCode.Int32: - { - var out_addr = (int*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt32(Math.Sign(out_addr[i])); - return @out; - } - case NPTypeCode.UInt32: - { - var out_addr = (uint*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt32(Math.Sign(out_addr[i])); - return @out; - } - case NPTypeCode.Int64: - { - var out_addr = (long*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt64(Math.Sign(out_addr[i])); - return @out; - } - case NPTypeCode.UInt64: - { - var out_addr = (ulong*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt64(Math.Sign((long)out_addr[i])); - return @out; - } - case NPTypeCode.Char: - { - var out_addr = (char*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToChar(Math.Sign(out_addr[i])); - return @out; - } - case NPTypeCode.Double: - { - var out_addr = (double*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToDouble(Math.Sign(out_addr[i])); - return @out; - } - case NPTypeCode.Single: - { - var out_addr = (float*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToSingle(Math.Sign(out_addr[i])); - return @out; - } - case NPTypeCode.Decimal: - { - var out_addr = (decimal*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = (decimal)(Math.Sign(Converts.ToDouble(out_addr[i]))); - return @out; - } - default: - throw new NotSupportedException(); -#endif - } - } + return ExecuteUnaryOp(in nd, UnaryOp.Sign, ResolveUnaryReturnType(nd, typeCode)); } } } diff --git a/src/NumSharp.Core/Backends/Default/Math/Default.Sin.cs b/src/NumSharp.Core/Backends/Default/Math/Default.Sin.cs index a1da4f72..b634215b 100644 --- a/src/NumSharp.Core/Backends/Default/Math/Default.Sin.cs +++ b/src/NumSharp.Core/Backends/Default/Math/Default.Sin.cs @@ -1,7 +1,5 @@ using System; -using DecimalMath; -using NumSharp.Utilities; -using System.Threading.Tasks; +using NumSharp.Backends.Kernels; namespace NumSharp.Backends { @@ -9,108 +7,12 @@ public partial class DefaultEngine { public override NDArray Sin(in NDArray nd, Type dtype) => Sin(nd, dtype?.GetTypeCode()); + /// + /// Element-wise sine using IL-generated kernels. + /// public override NDArray Sin(in NDArray nd, NPTypeCode? typeCode = null) { - if (nd.size == 0) - return nd.Clone(); - - - var @out = Cast(nd, ResolveUnaryReturnType(nd, typeCode), copy: true); - var len = @out.size; - - unsafe - { - switch (@out.GetTypeCode) - { -#if _REGEN - %foreach except(supported_numericals, "Decimal"),except(supported_numericals_lowercase, "decimal")% - case NPTypeCode.#1: - { - var out_addr = (#2*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.To#1(Math.Sin(out_addr[i])); - return @out; - } - % - case NPTypeCode.Decimal: - { - var out_addr = (decimal*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = (decimal)(Math.Sin(Converts.ToDouble(out_addr[i]))); - return @out; - } - default: - throw new NotSupportedException(); -#else - case NPTypeCode.Byte: - { - var out_addr = (byte*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToByte(Math.Sin(out_addr[i])); - return @out; - } - case NPTypeCode.Int16: - { - var out_addr = (short*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt16(Math.Sin(out_addr[i])); - return @out; - } - case NPTypeCode.UInt16: - { - var out_addr = (ushort*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt16(Math.Sin(out_addr[i])); - return @out; - } - case NPTypeCode.Int32: - { - var out_addr = (int*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt32(Math.Sin(out_addr[i])); - return @out; - } - case NPTypeCode.UInt32: - { - var out_addr = (uint*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt32(Math.Sin(out_addr[i])); - return @out; - } - case NPTypeCode.Int64: - { - var out_addr = (long*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt64(Math.Sin(out_addr[i])); - return @out; - } - case NPTypeCode.UInt64: - { - var out_addr = (ulong*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt64(Math.Sin(out_addr[i])); - return @out; - } - case NPTypeCode.Char: - { - var out_addr = (char*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToChar(Math.Sin(out_addr[i])); - return @out; - } - case NPTypeCode.Double: - { - var out_addr = (double*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToDouble(Math.Sin(out_addr[i])); - return @out; - } - case NPTypeCode.Single: - { - var out_addr = (float*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToSingle(Math.Sin(out_addr[i])); - return @out; - } - case NPTypeCode.Decimal: - { - var out_addr = (decimal*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = (decimal)(Math.Sin(Converts.ToDouble(out_addr[i]))); - return @out; - } - default: - throw new NotSupportedException(); -#endif - } - } + return ExecuteUnaryOp(in nd, UnaryOp.Sin, ResolveUnaryReturnType(nd, typeCode)); } } } diff --git a/src/NumSharp.Core/Backends/Default/Math/Default.Sinh.cs b/src/NumSharp.Core/Backends/Default/Math/Default.Sinh.cs index 6d6f3413..1e2e9d5d 100644 --- a/src/NumSharp.Core/Backends/Default/Math/Default.Sinh.cs +++ b/src/NumSharp.Core/Backends/Default/Math/Default.Sinh.cs @@ -1,6 +1,5 @@ -using System; -using NumSharp.Utilities; -using System.Threading.Tasks; +using System; +using NumSharp.Backends.Kernels; namespace NumSharp.Backends { @@ -8,108 +7,12 @@ public partial class DefaultEngine { public override NDArray Sinh(in NDArray nd, Type dtype) => Sinh(nd, dtype?.GetTypeCode()); + /// + /// Element-wise hyperbolic sine using IL-generated kernels. + /// public override NDArray Sinh(in NDArray nd, NPTypeCode? typeCode = null) { - if (nd.size == 0) - return nd.Clone(); - - - var @out = Cast(nd, ResolveUnaryReturnType(nd, typeCode), copy: true); - var len = @out.size; - - unsafe - { - switch (@out.GetTypeCode) - { -#if _REGEN - %foreach except(supported_numericals, "Decimal"),except(supported_numericals_lowercase, "decimal")% - case NPTypeCode.#1: - { - var out_addr = (#2*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.To#1(Math.Sinh(out_addr[i])); - return @out; - } - % - case NPTypeCode.Decimal: - { - var out_addr = (decimal*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = (decimal)(Math.Sinh(Converts.ToDouble(out_addr[i]))); - return @out; - } - default: - throw new NotSupportedException(); -#else - case NPTypeCode.Byte: - { - var out_addr = (byte*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToByte(Math.Sinh(out_addr[i])); - return @out; - } - case NPTypeCode.Int16: - { - var out_addr = (short*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt16(Math.Sinh(out_addr[i])); - return @out; - } - case NPTypeCode.UInt16: - { - var out_addr = (ushort*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt16(Math.Sinh(out_addr[i])); - return @out; - } - case NPTypeCode.Int32: - { - var out_addr = (int*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt32(Math.Sinh(out_addr[i])); - return @out; - } - case NPTypeCode.UInt32: - { - var out_addr = (uint*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt32(Math.Sinh(out_addr[i])); - return @out; - } - case NPTypeCode.Int64: - { - var out_addr = (long*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt64(Math.Sinh(out_addr[i])); - return @out; - } - case NPTypeCode.UInt64: - { - var out_addr = (ulong*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt64(Math.Sinh(out_addr[i])); - return @out; - } - case NPTypeCode.Char: - { - var out_addr = (char*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToChar(Math.Sinh(out_addr[i])); - return @out; - } - case NPTypeCode.Double: - { - var out_addr = (double*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToDouble(Math.Sinh(out_addr[i])); - return @out; - } - case NPTypeCode.Single: - { - var out_addr = (float*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToSingle(Math.Sinh(out_addr[i])); - return @out; - } - case NPTypeCode.Decimal: - { - var out_addr = (decimal*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = (decimal)(Math.Sinh(Converts.ToDouble(out_addr[i]))); - return @out; - } - default: - throw new NotSupportedException(); -#endif - } - } + return ExecuteUnaryOp(in nd, UnaryOp.Sinh, ResolveUnaryReturnType(nd, typeCode)); } } } diff --git a/src/NumSharp.Core/Backends/Default/Math/Default.Sqrt.cs b/src/NumSharp.Core/Backends/Default/Math/Default.Sqrt.cs index 26447df3..b4fefead 100644 --- a/src/NumSharp.Core/Backends/Default/Math/Default.Sqrt.cs +++ b/src/NumSharp.Core/Backends/Default/Math/Default.Sqrt.cs @@ -1,7 +1,5 @@ using System; -using DecimalMath; -using NumSharp.Utilities; -using System.Threading.Tasks; +using NumSharp.Backends.Kernels; namespace NumSharp.Backends { @@ -9,107 +7,12 @@ public partial class DefaultEngine { public override NDArray Sqrt(in NDArray nd, Type dtype) => Sqrt(nd, dtype?.GetTypeCode()); + /// + /// Element-wise square root using IL-generated kernels. + /// public override NDArray Sqrt(in NDArray nd, NPTypeCode? typeCode = null) { - if (nd.size == 0) - return nd.Clone(); - - var @out = Cast(nd, ResolveUnaryReturnType(nd, typeCode), copy: true); - var len = @out.size; - - unsafe - { - switch (@out.GetTypeCode) - { -#if _REGEN - %foreach except(supported_numericals, "Decimal"),except(supported_numericals_lowercase, "decimal")% - case NPTypeCode.#1: - { - var out_addr = (#2*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.To#1(Math.Sqrt(out_addr[i])); - return @out; - } - % - case NPTypeCode.Decimal: - { - var out_addr = (decimal*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = (DecimalEx.Sqrt(out_addr[i])); - return @out; - } - default: - throw new NotSupportedException(); -#else - case NPTypeCode.Byte: - { - var out_addr = (byte*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToByte(Math.Sqrt(out_addr[i])); - return @out; - } - case NPTypeCode.Int16: - { - var out_addr = (short*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt16(Math.Sqrt(out_addr[i])); - return @out; - } - case NPTypeCode.UInt16: - { - var out_addr = (ushort*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt16(Math.Sqrt(out_addr[i])); - return @out; - } - case NPTypeCode.Int32: - { - var out_addr = (int*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt32(Math.Sqrt(out_addr[i])); - return @out; - } - case NPTypeCode.UInt32: - { - var out_addr = (uint*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt32(Math.Sqrt(out_addr[i])); - return @out; - } - case NPTypeCode.Int64: - { - var out_addr = (long*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt64(Math.Sqrt(out_addr[i])); - return @out; - } - case NPTypeCode.UInt64: - { - var out_addr = (ulong*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt64(Math.Sqrt(out_addr[i])); - return @out; - } - case NPTypeCode.Char: - { - var out_addr = (char*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToChar(Math.Sqrt(out_addr[i])); - return @out; - } - case NPTypeCode.Double: - { - var out_addr = (double*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToDouble(Math.Sqrt(out_addr[i])); - return @out; - } - case NPTypeCode.Single: - { - var out_addr = (float*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToSingle(Math.Sqrt(out_addr[i])); - return @out; - } - case NPTypeCode.Decimal: - { - var out_addr = (decimal*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = (DecimalEx.Sqrt(out_addr[i])); - return @out; - } - default: - throw new NotSupportedException(); -#endif - } - } + return ExecuteUnaryOp(in nd, UnaryOp.Sqrt, ResolveUnaryReturnType(nd, typeCode)); } } } diff --git a/src/NumSharp.Core/Backends/Default/Math/Default.Subtract.cs b/src/NumSharp.Core/Backends/Default/Math/Default.Subtract.cs index 85317c55..d5de4842 100644 --- a/src/NumSharp.Core/Backends/Default/Math/Default.Subtract.cs +++ b/src/NumSharp.Core/Backends/Default/Math/Default.Subtract.cs @@ -1,36 +1,16 @@ -using System; +using NumSharp.Backends.Kernels; namespace NumSharp.Backends { public partial class DefaultEngine { + /// + /// Element-wise subtraction using IL-generated kernels. + /// Supports all 144 type combinations with automatic type promotion. + /// public override NDArray Subtract(in NDArray lhs, in NDArray rhs) { - switch (lhs.GetTypeCode) - { -#if _REGEN - %foreach supported_dtypes,supported_dtypes_lowercase% - case NPTypeCode.#1: return Subtract#1(lhs, rhs); - % - default: - throw new NotSupportedException(); -#else - case NPTypeCode.Boolean: return SubtractBoolean(lhs, rhs); - case NPTypeCode.Byte: return SubtractByte(lhs, rhs); - case NPTypeCode.Int16: return SubtractInt16(lhs, rhs); - case NPTypeCode.UInt16: return SubtractUInt16(lhs, rhs); - case NPTypeCode.Int32: return SubtractInt32(lhs, rhs); - case NPTypeCode.UInt32: return SubtractUInt32(lhs, rhs); - case NPTypeCode.Int64: return SubtractInt64(lhs, rhs); - case NPTypeCode.UInt64: return SubtractUInt64(lhs, rhs); - case NPTypeCode.Char: return SubtractChar(lhs, rhs); - case NPTypeCode.Double: return SubtractDouble(lhs, rhs); - case NPTypeCode.Single: return SubtractSingle(lhs, rhs); - case NPTypeCode.Decimal: return SubtractDecimal(lhs, rhs); - default: - throw new NotSupportedException(); -#endif - } + return ExecuteBinaryOp(in lhs, in rhs, BinaryOp.Subtract); } } } diff --git a/src/NumSharp.Core/Backends/Default/Math/Default.Tan.cs b/src/NumSharp.Core/Backends/Default/Math/Default.Tan.cs index 9ffe809b..0b5f9d8c 100644 --- a/src/NumSharp.Core/Backends/Default/Math/Default.Tan.cs +++ b/src/NumSharp.Core/Backends/Default/Math/Default.Tan.cs @@ -1,7 +1,5 @@ -using System; -using System.Threading.Tasks; -using DecimalMath; -using NumSharp.Utilities; +using System; +using NumSharp.Backends.Kernels; namespace NumSharp.Backends { @@ -9,107 +7,12 @@ public partial class DefaultEngine { public override NDArray Tan(in NDArray nd, Type dtype) => Tan(nd, dtype?.GetTypeCode()); + /// + /// Element-wise tangent using IL-generated kernels. + /// public override NDArray Tan(in NDArray nd, NPTypeCode? typeCode = null) { - if (nd.size == 0) - return nd.Clone(); - - var @out = Cast(nd, ResolveUnaryReturnType(nd, typeCode), copy: true); - var len = @out.size; - - unsafe - { - switch (@out.GetTypeCode) - { -#if _REGEN - %foreach except(supported_numericals, "Decimal"),except(supported_numericals_lowercase, "decimal")% - case NPTypeCode.#1: - { - var out_addr = (#2*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.To#1(Math.Tan(out_addr[i])); - return @out; - } - % - case NPTypeCode.Decimal: - { - var out_addr = (decimal*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = (DecimalEx.Tan(out_addr[i])); - return @out; - } - default: - throw new NotSupportedException(); -#else - case NPTypeCode.Byte: - { - var out_addr = (byte*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToByte(Math.Tan(out_addr[i])); - return @out; - } - case NPTypeCode.Int16: - { - var out_addr = (short*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt16(Math.Tan(out_addr[i])); - return @out; - } - case NPTypeCode.UInt16: - { - var out_addr = (ushort*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt16(Math.Tan(out_addr[i])); - return @out; - } - case NPTypeCode.Int32: - { - var out_addr = (int*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt32(Math.Tan(out_addr[i])); - return @out; - } - case NPTypeCode.UInt32: - { - var out_addr = (uint*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt32(Math.Tan(out_addr[i])); - return @out; - } - case NPTypeCode.Int64: - { - var out_addr = (long*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt64(Math.Tan(out_addr[i])); - return @out; - } - case NPTypeCode.UInt64: - { - var out_addr = (ulong*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt64(Math.Tan(out_addr[i])); - return @out; - } - case NPTypeCode.Char: - { - var out_addr = (char*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToChar(Math.Tan(out_addr[i])); - return @out; - } - case NPTypeCode.Double: - { - var out_addr = (double*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToDouble(Math.Tan(out_addr[i])); - return @out; - } - case NPTypeCode.Single: - { - var out_addr = (float*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToSingle(Math.Tan(out_addr[i])); - return @out; - } - case NPTypeCode.Decimal: - { - var out_addr = (decimal*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = (DecimalEx.Tan(out_addr[i])); - return @out; - } - default: - throw new NotSupportedException(); -#endif - } - } + return ExecuteUnaryOp(in nd, UnaryOp.Tan, ResolveUnaryReturnType(nd, typeCode)); } } } diff --git a/src/NumSharp.Core/Backends/Default/Math/Default.Tanh.cs b/src/NumSharp.Core/Backends/Default/Math/Default.Tanh.cs index 3cc1cfbb..09ef899d 100644 --- a/src/NumSharp.Core/Backends/Default/Math/Default.Tanh.cs +++ b/src/NumSharp.Core/Backends/Default/Math/Default.Tanh.cs @@ -1,6 +1,5 @@ -using System; -using System.Threading.Tasks; -using NumSharp.Utilities; +using System; +using NumSharp.Backends.Kernels; namespace NumSharp.Backends { @@ -8,107 +7,12 @@ public partial class DefaultEngine { public override NDArray Tanh(in NDArray nd, Type dtype) => Tanh(nd, dtype?.GetTypeCode()); + /// + /// Element-wise hyperbolic tangent using IL-generated kernels. + /// public override NDArray Tanh(in NDArray nd, NPTypeCode? typeCode = null) { - if (nd.size == 0) - return nd.Clone(); - - var @out = Cast(nd, ResolveUnaryReturnType(nd, typeCode), copy: true); - var len = @out.size; - - unsafe - { - switch (@out.GetTypeCode) - { -#if _REGEN - %foreach except(supported_numericals, "Decimal"),except(supported_numericals_lowercase, "decimal")% - case NPTypeCode.#1: - { - var out_addr = (#2*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.To#1(Math.Tanh(out_addr[i])); - return @out; - } - % - case NPTypeCode.Decimal: - { - var out_addr = (decimal*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = (decimal)(Math.Tanh(Converts.ToDouble(out_addr[i]))); - return @out; - } - default: - throw new NotSupportedException(); -#else - case NPTypeCode.Byte: - { - var out_addr = (byte*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToByte(Math.Tanh(out_addr[i])); - return @out; - } - case NPTypeCode.Int16: - { - var out_addr = (short*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt16(Math.Tanh(out_addr[i])); - return @out; - } - case NPTypeCode.UInt16: - { - var out_addr = (ushort*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt16(Math.Tanh(out_addr[i])); - return @out; - } - case NPTypeCode.Int32: - { - var out_addr = (int*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt32(Math.Tanh(out_addr[i])); - return @out; - } - case NPTypeCode.UInt32: - { - var out_addr = (uint*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt32(Math.Tanh(out_addr[i])); - return @out; - } - case NPTypeCode.Int64: - { - var out_addr = (long*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToInt64(Math.Tanh(out_addr[i])); - return @out; - } - case NPTypeCode.UInt64: - { - var out_addr = (ulong*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToUInt64(Math.Tanh(out_addr[i])); - return @out; - } - case NPTypeCode.Char: - { - var out_addr = (char*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToChar(Math.Tanh(out_addr[i])); - return @out; - } - case NPTypeCode.Double: - { - var out_addr = (double*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToDouble(Math.Tanh(out_addr[i])); - return @out; - } - case NPTypeCode.Single: - { - var out_addr = (float*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = Converts.ToSingle(Math.Tanh(out_addr[i])); - return @out; - } - case NPTypeCode.Decimal: - { - var out_addr = (decimal*)@out.Address; - for (int i = 0; i < len; i++) out_addr[i] = (decimal)(Math.Tanh(Converts.ToDouble(out_addr[i]))); - return @out; - } - default: - throw new NotSupportedException(); -#endif - } - } + return ExecuteUnaryOp(in nd, UnaryOp.Tanh, ResolveUnaryReturnType(nd, typeCode)); } } } diff --git a/src/NumSharp.Core/Backends/Default/Math/DefaultEngine.BinaryOp.cs b/src/NumSharp.Core/Backends/Default/Math/DefaultEngine.BinaryOp.cs new file mode 100644 index 00000000..8f64f664 --- /dev/null +++ b/src/NumSharp.Core/Backends/Default/Math/DefaultEngine.BinaryOp.cs @@ -0,0 +1,245 @@ +using System; +using System.Runtime.CompilerServices; +using NumSharp.Backends.Kernels; +using NumSharp.Utilities; + +namespace NumSharp.Backends +{ + /// + /// Binary operation dispatch using IL-generated kernels. + /// + public partial class DefaultEngine + { + /// + /// Execute a binary operation using IL-generated kernels. + /// Handles type promotion, broadcasting, and kernel dispatch. + /// + /// Left operand + /// Right operand + /// Operation to perform + /// Result array with promoted type + [MethodImpl(MethodImplOptions.AggressiveOptimization)] + internal unsafe NDArray ExecuteBinaryOp(in NDArray lhs, in NDArray rhs, BinaryOp op) + { + var lhsType = lhs.GetTypeCode; + var rhsType = rhs.GetTypeCode; + + // Determine result type using NumPy type promotion rules + var resultType = np._FindCommonType(lhs, rhs); + + // NumPy: true division (/) always returns float64 for integer types + // This matches Python 3 / NumPy 2.x semantics where / is "true division" + // Group 3 = float (Single, Double), Group 4 = Decimal + if (op == BinaryOp.Divide && resultType.GetGroup() < 3) + { + resultType = NPTypeCode.Double; + } + + // Handle scalar × scalar case + if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) + { + return ExecuteScalarScalar(lhs, rhs, op, resultType); + } + + // Broadcast shapes + var (leftShape, rightShape) = Broadcast(lhs.Shape, rhs.Shape); + var resultShape = leftShape.Clean(); + + // Allocate result + var result = new NDArray(resultType, resultShape, false); + + // Classify execution path using strides + ExecutionPath path; + fixed (int* lhsStrides = leftShape.strides) + fixed (int* rhsStrides = rightShape.strides) + fixed (int* shape = resultShape.dimensions) + { + path = ClassifyPath(lhsStrides, rhsStrides, shape, resultShape.NDim, resultType); + } + + // Get kernel key + var key = new MixedTypeKernelKey(lhsType, rhsType, resultType, op, path); + + // Get or generate kernel + var kernel = ILKernelGenerator.TryGetMixedTypeKernel(key); + + if (kernel != null) + { + // Execute IL kernel + ExecuteKernel(kernel, lhs, rhs, result, leftShape, rightShape); + } + else + { + // Fallback to legacy implementation + FallbackBinaryOp(lhs, rhs, result, op, leftShape, rightShape); + } + + return result; + } + + /// + /// Execute scalar × scalar operation using IL-generated delegate. + /// + private NDArray ExecuteScalarScalar(in NDArray lhs, in NDArray rhs, BinaryOp op, NPTypeCode resultType) + { + var lhsType = lhs.GetTypeCode; + var rhsType = rhs.GetTypeCode; + var key = new BinaryScalarKernelKey(lhsType, rhsType, resultType, op); + var func = ILKernelGenerator.GetBinaryScalarDelegate(key); + + // Dispatch based on lhs type first + return lhsType switch + { + NPTypeCode.Boolean => InvokeBinaryScalarLhs(func, lhs.GetBoolean(), rhs, rhsType, resultType), + NPTypeCode.Byte => InvokeBinaryScalarLhs(func, lhs.GetByte(), rhs, rhsType, resultType), + NPTypeCode.Int16 => InvokeBinaryScalarLhs(func, lhs.GetInt16(), rhs, rhsType, resultType), + NPTypeCode.UInt16 => InvokeBinaryScalarLhs(func, lhs.GetUInt16(), rhs, rhsType, resultType), + NPTypeCode.Int32 => InvokeBinaryScalarLhs(func, lhs.GetInt32(), rhs, rhsType, resultType), + NPTypeCode.UInt32 => InvokeBinaryScalarLhs(func, lhs.GetUInt32(), rhs, rhsType, resultType), + NPTypeCode.Int64 => InvokeBinaryScalarLhs(func, lhs.GetInt64(), rhs, rhsType, resultType), + NPTypeCode.UInt64 => InvokeBinaryScalarLhs(func, lhs.GetUInt64(), rhs, rhsType, resultType), + NPTypeCode.Char => InvokeBinaryScalarLhs(func, lhs.GetChar(), rhs, rhsType, resultType), + NPTypeCode.Single => InvokeBinaryScalarLhs(func, lhs.GetSingle(), rhs, rhsType, resultType), + NPTypeCode.Double => InvokeBinaryScalarLhs(func, lhs.GetDouble(), rhs, rhsType, resultType), + NPTypeCode.Decimal => InvokeBinaryScalarLhs(func, lhs.GetDecimal(), rhs, rhsType, resultType), + _ => throw new NotSupportedException($"LHS type {lhsType} not supported") + }; + } + + /// + /// Continue binary scalar dispatch with typed LHS value. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static NDArray InvokeBinaryScalarLhs( + Delegate func, TLhs lhsVal, in NDArray rhs, NPTypeCode rhsType, NPTypeCode resultType) + { + // Dispatch based on rhs type + return rhsType switch + { + NPTypeCode.Boolean => InvokeBinaryScalarRhs(func, lhsVal, rhs.GetBoolean(), resultType), + NPTypeCode.Byte => InvokeBinaryScalarRhs(func, lhsVal, rhs.GetByte(), resultType), + NPTypeCode.Int16 => InvokeBinaryScalarRhs(func, lhsVal, rhs.GetInt16(), resultType), + NPTypeCode.UInt16 => InvokeBinaryScalarRhs(func, lhsVal, rhs.GetUInt16(), resultType), + NPTypeCode.Int32 => InvokeBinaryScalarRhs(func, lhsVal, rhs.GetInt32(), resultType), + NPTypeCode.UInt32 => InvokeBinaryScalarRhs(func, lhsVal, rhs.GetUInt32(), resultType), + NPTypeCode.Int64 => InvokeBinaryScalarRhs(func, lhsVal, rhs.GetInt64(), resultType), + NPTypeCode.UInt64 => InvokeBinaryScalarRhs(func, lhsVal, rhs.GetUInt64(), resultType), + NPTypeCode.Char => InvokeBinaryScalarRhs(func, lhsVal, rhs.GetChar(), resultType), + NPTypeCode.Single => InvokeBinaryScalarRhs(func, lhsVal, rhs.GetSingle(), resultType), + NPTypeCode.Double => InvokeBinaryScalarRhs(func, lhsVal, rhs.GetDouble(), resultType), + NPTypeCode.Decimal => InvokeBinaryScalarRhs(func, lhsVal, rhs.GetDecimal(), resultType), + _ => throw new NotSupportedException($"RHS type {rhsType} not supported") + }; + } + + /// + /// Complete binary scalar dispatch with typed LHS and RHS values. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static NDArray InvokeBinaryScalarRhs( + Delegate func, TLhs lhsVal, TRhs rhsVal, NPTypeCode resultType) + { + // Dispatch based on result type + return resultType switch + { + NPTypeCode.Boolean => NDArray.Scalar(((Func)func)(lhsVal, rhsVal)), + NPTypeCode.Byte => NDArray.Scalar(((Func)func)(lhsVal, rhsVal)), + NPTypeCode.Int16 => NDArray.Scalar(((Func)func)(lhsVal, rhsVal)), + NPTypeCode.UInt16 => NDArray.Scalar(((Func)func)(lhsVal, rhsVal)), + NPTypeCode.Int32 => NDArray.Scalar(((Func)func)(lhsVal, rhsVal)), + NPTypeCode.UInt32 => NDArray.Scalar(((Func)func)(lhsVal, rhsVal)), + NPTypeCode.Int64 => NDArray.Scalar(((Func)func)(lhsVal, rhsVal)), + NPTypeCode.UInt64 => NDArray.Scalar(((Func)func)(lhsVal, rhsVal)), + NPTypeCode.Char => NDArray.Scalar(((Func)func)(lhsVal, rhsVal)), + NPTypeCode.Single => NDArray.Scalar(((Func)func)(lhsVal, rhsVal)), + NPTypeCode.Double => NDArray.Scalar(((Func)func)(lhsVal, rhsVal)), + NPTypeCode.Decimal => NDArray.Scalar(((Func)func)(lhsVal, rhsVal)), + _ => throw new NotSupportedException($"Result type {resultType} not supported") + }; + } + + /// + /// Classify execution path based on strides. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static unsafe ExecutionPath ClassifyPath( + int* lhsStrides, int* rhsStrides, int* shape, int ndim, NPTypeCode resultType) + { + if (ndim == 0) + return ExecutionPath.SimdFull; + + bool lhsContiguous = StrideDetector.IsContiguous(lhsStrides, shape, ndim); + bool rhsContiguous = StrideDetector.IsContiguous(rhsStrides, shape, ndim); + + if (lhsContiguous && rhsContiguous) + return ExecutionPath.SimdFull; + + // SimdScalarRight/Left require the non-scalar operand to be contiguous + // because their loops use simple i * elemSize indexing + bool rhsScalar = StrideDetector.IsScalar(rhsStrides, ndim); + if (rhsScalar && lhsContiguous) + return ExecutionPath.SimdScalarRight; + + bool lhsScalar = StrideDetector.IsScalar(lhsStrides, ndim); + if (lhsScalar && rhsContiguous) + return ExecutionPath.SimdScalarLeft; + + // Check for inner-contiguous (chunk-able) + int lhsInner = lhsStrides[ndim - 1]; + int rhsInner = rhsStrides[ndim - 1]; + if ((lhsInner == 1 || lhsInner == 0) && (rhsInner == 1 || rhsInner == 0)) + return ExecutionPath.SimdChunk; + + return ExecutionPath.General; + } + + /// + /// Execute the IL-generated kernel. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static unsafe void ExecuteKernel( + MixedTypeKernel kernel, + in NDArray lhs, in NDArray rhs, NDArray result, + Shape lhsShape, Shape rhsShape) + { + // Get element sizes for offset calculation + int lhsElemSize = lhs.dtypesize; + int rhsElemSize = rhs.dtypesize; + + // Calculate base addresses accounting for shape offsets (for sliced views) + // The Shape.offset represents the element offset into the underlying storage + byte* lhsAddr = (byte*)lhs.Address + lhsShape.offset * lhsElemSize; + byte* rhsAddr = (byte*)rhs.Address + rhsShape.offset * rhsElemSize; + + fixed (int* lhsStrides = lhsShape.strides) + fixed (int* rhsStrides = rhsShape.strides) + fixed (int* shape = result.shape) + { + kernel( + (void*)lhsAddr, + (void*)rhsAddr, + (void*)result.Address, + lhsStrides, + rhsStrides, + shape, + result.ndim, + result.size + ); + } + } + + /// + /// Fallback to legacy implementation when IL kernel is not available. + /// + private void FallbackBinaryOp( + in NDArray lhs, in NDArray rhs, NDArray result, + BinaryOp op, Shape lhsShape, Shape rhsShape) + { + // For now, throw - all kernels should be generatable + // In future, this could call the legacy generated code + throw new NotSupportedException( + $"IL kernel not available for {lhs.GetTypeCode} {op} {rhs.GetTypeCode} -> {result.GetTypeCode}. " + + "Please report this as a bug."); + } + } +} diff --git a/src/NumSharp.Core/Backends/Default/Math/DefaultEngine.BitwiseOp.cs b/src/NumSharp.Core/Backends/Default/Math/DefaultEngine.BitwiseOp.cs new file mode 100644 index 00000000..0070b561 --- /dev/null +++ b/src/NumSharp.Core/Backends/Default/Math/DefaultEngine.BitwiseOp.cs @@ -0,0 +1,35 @@ +using System.Runtime.CompilerServices; +using NumSharp.Backends.Kernels; + +namespace NumSharp.Backends +{ + /// + /// Bitwise operation dispatch using IL-generated kernels. + /// + public partial class DefaultEngine + { + /// + /// Execute bitwise AND operation. + /// + public override NDArray BitwiseAnd(in NDArray lhs, in NDArray rhs) + { + return ExecuteBinaryOp(lhs, rhs, BinaryOp.BitwiseAnd); + } + + /// + /// Execute bitwise OR operation. + /// + public override NDArray BitwiseOr(in NDArray lhs, in NDArray rhs) + { + return ExecuteBinaryOp(lhs, rhs, BinaryOp.BitwiseOr); + } + + /// + /// Execute bitwise XOR operation. + /// + public override NDArray BitwiseXor(in NDArray lhs, in NDArray rhs) + { + return ExecuteBinaryOp(lhs, rhs, BinaryOp.BitwiseXor); + } + } +} diff --git a/src/NumSharp.Core/Backends/Default/Math/DefaultEngine.CompareOp.cs b/src/NumSharp.Core/Backends/Default/Math/DefaultEngine.CompareOp.cs new file mode 100644 index 00000000..ab2f513d --- /dev/null +++ b/src/NumSharp.Core/Backends/Default/Math/DefaultEngine.CompareOp.cs @@ -0,0 +1,203 @@ +using System; +using System.Runtime.CompilerServices; +using NumSharp.Backends.Kernels; +using NumSharp.Generic; +using NumSharp.Utilities; + +namespace NumSharp.Backends +{ + /// + /// Comparison operation dispatch using IL-generated kernels. + /// + public partial class DefaultEngine + { + /// + /// Execute a comparison operation using IL-generated kernels. + /// Handles type promotion, broadcasting, and kernel dispatch. + /// Result is always NDArray<bool>. + /// + /// Left operand + /// Right operand + /// Comparison operation to perform + /// Result array with bool type + [MethodImpl(MethodImplOptions.AggressiveOptimization)] + internal unsafe NDArray ExecuteComparisonOp(in NDArray lhs, in NDArray rhs, ComparisonOp op) + { + var lhsType = lhs.GetTypeCode; + var rhsType = rhs.GetTypeCode; + + // Handle scalar × scalar case + if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) + { + return ExecuteComparisonScalarScalar(lhs, rhs, op); + } + + // Broadcast shapes + var (leftShape, rightShape) = Broadcast(lhs.Shape, rhs.Shape); + var resultShape = leftShape.Clean(); + + // Allocate result (always bool) + var result = new NDArray(resultShape, true); + + // Classify execution path using strides + ExecutionPath path; + fixed (int* lhsStrides = leftShape.strides) + fixed (int* rhsStrides = rightShape.strides) + fixed (int* shape = resultShape.dimensions) + { + path = ClassifyPath(lhsStrides, rhsStrides, shape, resultShape.NDim, NPTypeCode.Boolean); + } + + // Get kernel key + var key = new ComparisonKernelKey(lhsType, rhsType, op, path); + + // Get or generate kernel + var kernel = ILKernelGenerator.TryGetComparisonKernel(key); + + if (kernel != null) + { + // Execute IL kernel + ExecuteComparisonKernel(kernel, lhs, rhs, result, leftShape, rightShape); + } + else + { + // Fallback - should not happen + throw new NotSupportedException( + $"IL kernel not available for comparison {lhsType} {op} {rhsType}. " + + "Please report this as a bug."); + } + + return result; + } + + /// + /// Execute scalar × scalar comparison using IL-generated delegate. + /// + private NDArray ExecuteComparisonScalarScalar(in NDArray lhs, in NDArray rhs, ComparisonOp op) + { + var lhsType = lhs.GetTypeCode; + var rhsType = rhs.GetTypeCode; + var key = new ILKernelGenerator.ComparisonScalarKernelKey(lhsType, rhsType, op); + var func = ILKernelGenerator.GetComparisonScalarDelegate(key); + + // Dispatch based on lhs type first + return lhsType switch + { + NPTypeCode.Boolean => InvokeComparisonScalarLhs(func, lhs.GetBoolean(), rhs, rhsType), + NPTypeCode.Byte => InvokeComparisonScalarLhs(func, lhs.GetByte(), rhs, rhsType), + NPTypeCode.Int16 => InvokeComparisonScalarLhs(func, lhs.GetInt16(), rhs, rhsType), + NPTypeCode.UInt16 => InvokeComparisonScalarLhs(func, lhs.GetUInt16(), rhs, rhsType), + NPTypeCode.Int32 => InvokeComparisonScalarLhs(func, lhs.GetInt32(), rhs, rhsType), + NPTypeCode.UInt32 => InvokeComparisonScalarLhs(func, lhs.GetUInt32(), rhs, rhsType), + NPTypeCode.Int64 => InvokeComparisonScalarLhs(func, lhs.GetInt64(), rhs, rhsType), + NPTypeCode.UInt64 => InvokeComparisonScalarLhs(func, lhs.GetUInt64(), rhs, rhsType), + NPTypeCode.Char => InvokeComparisonScalarLhs(func, lhs.GetChar(), rhs, rhsType), + NPTypeCode.Single => InvokeComparisonScalarLhs(func, lhs.GetSingle(), rhs, rhsType), + NPTypeCode.Double => InvokeComparisonScalarLhs(func, lhs.GetDouble(), rhs, rhsType), + NPTypeCode.Decimal => InvokeComparisonScalarLhs(func, lhs.GetDecimal(), rhs, rhsType), + _ => throw new NotSupportedException($"LHS type {lhsType} not supported") + }; + } + + /// + /// Continue comparison scalar dispatch with typed LHS value. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static NDArray InvokeComparisonScalarLhs( + Delegate func, TLhs lhsVal, in NDArray rhs, NPTypeCode rhsType) + { + // Dispatch based on rhs type + return rhsType switch + { + NPTypeCode.Boolean => NDArray.Scalar(((Func)func)(lhsVal, rhs.GetBoolean())).MakeGeneric(), + NPTypeCode.Byte => NDArray.Scalar(((Func)func)(lhsVal, rhs.GetByte())).MakeGeneric(), + NPTypeCode.Int16 => NDArray.Scalar(((Func)func)(lhsVal, rhs.GetInt16())).MakeGeneric(), + NPTypeCode.UInt16 => NDArray.Scalar(((Func)func)(lhsVal, rhs.GetUInt16())).MakeGeneric(), + NPTypeCode.Int32 => NDArray.Scalar(((Func)func)(lhsVal, rhs.GetInt32())).MakeGeneric(), + NPTypeCode.UInt32 => NDArray.Scalar(((Func)func)(lhsVal, rhs.GetUInt32())).MakeGeneric(), + NPTypeCode.Int64 => NDArray.Scalar(((Func)func)(lhsVal, rhs.GetInt64())).MakeGeneric(), + NPTypeCode.UInt64 => NDArray.Scalar(((Func)func)(lhsVal, rhs.GetUInt64())).MakeGeneric(), + NPTypeCode.Char => NDArray.Scalar(((Func)func)(lhsVal, rhs.GetChar())).MakeGeneric(), + NPTypeCode.Single => NDArray.Scalar(((Func)func)(lhsVal, rhs.GetSingle())).MakeGeneric(), + NPTypeCode.Double => NDArray.Scalar(((Func)func)(lhsVal, rhs.GetDouble())).MakeGeneric(), + NPTypeCode.Decimal => NDArray.Scalar(((Func)func)(lhsVal, rhs.GetDecimal())).MakeGeneric(), + _ => throw new NotSupportedException($"RHS type {rhsType} not supported") + }; + } + + /// + /// Execute the IL-generated comparison kernel. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static unsafe void ExecuteComparisonKernel( + ComparisonKernel kernel, + in NDArray lhs, in NDArray rhs, NDArray result, + Shape lhsShape, Shape rhsShape) + { + // Get element sizes for offset calculation + int lhsElemSize = lhs.dtypesize; + int rhsElemSize = rhs.dtypesize; + + // Calculate base addresses accounting for shape offsets (for sliced views) + byte* lhsAddr = (byte*)lhs.Address + lhsShape.offset * lhsElemSize; + byte* rhsAddr = (byte*)rhs.Address + rhsShape.offset * rhsElemSize; + + fixed (int* lhsStrides = lhsShape.strides) + fixed (int* rhsStrides = rhsShape.strides) + fixed (int* shape = result.shape) + { + kernel( + (void*)lhsAddr, + (void*)rhsAddr, + (bool*)result.Address, + lhsStrides, + rhsStrides, + shape, + result.ndim, + result.size + ); + } + } + + #region Public API - Comparison Operations (TensorEngine overrides) + + /// + /// Element-wise equal comparison (==). + /// Overrides TensorEngine.Compare - used by the == operator. + /// + public override NDArray Compare(in NDArray lhs, in NDArray rhs) + => ExecuteComparisonOp(lhs, rhs, ComparisonOp.Equal); + + /// + /// Element-wise not-equal comparison (!=). + /// + public override NDArray NotEqual(in NDArray lhs, in NDArray rhs) + => ExecuteComparisonOp(lhs, rhs, ComparisonOp.NotEqual); + + /// + /// Element-wise less-than comparison (<). + /// + public override NDArray Less(in NDArray lhs, in NDArray rhs) + => ExecuteComparisonOp(lhs, rhs, ComparisonOp.Less); + + /// + /// Element-wise less-than-or-equal comparison (<=). + /// + public override NDArray LessEqual(in NDArray lhs, in NDArray rhs) + => ExecuteComparisonOp(lhs, rhs, ComparisonOp.LessEqual); + + /// + /// Element-wise greater-than comparison (>). + /// + public override NDArray Greater(in NDArray lhs, in NDArray rhs) + => ExecuteComparisonOp(lhs, rhs, ComparisonOp.Greater); + + /// + /// Element-wise greater-than-or-equal comparison (>=). + /// + public override NDArray GreaterEqual(in NDArray lhs, in NDArray rhs) + => ExecuteComparisonOp(lhs, rhs, ComparisonOp.GreaterEqual); + + #endregion + } +} diff --git a/src/NumSharp.Core/Backends/Default/Math/DefaultEngine.ReductionOp.cs b/src/NumSharp.Core/Backends/Default/Math/DefaultEngine.ReductionOp.cs new file mode 100644 index 00000000..6c1415b3 --- /dev/null +++ b/src/NumSharp.Core/Backends/Default/Math/DefaultEngine.ReductionOp.cs @@ -0,0 +1,315 @@ +using System; +using System.Runtime.CompilerServices; +using NumSharp.Backends.Kernels; +using NumSharp.Utilities; + +namespace NumSharp.Backends +{ + /// + /// Reduction operation dispatch using IL-generated kernels. + /// + public partial class DefaultEngine + { + /// + /// Execute an element-wise reduction operation (axis=null) using IL-generated kernels. + /// Reduces all elements to a single scalar value. + /// + /// Result type + /// Input array + /// Reduction operation + /// Optional accumulator type (defaults to input type) + /// Scalar result + [MethodImpl(MethodImplOptions.AggressiveOptimization)] + internal unsafe TResult ExecuteElementReduction(in NDArray arr, ReductionOp op, NPTypeCode? accumulatorType = null) + where TResult : unmanaged + { + if (arr.size == 0) + { + // Return identity for empty arrays + return (TResult)op.GetIdentity(typeof(TResult).GetTypeCode()); + } + + var inputType = arr.GetTypeCode; + var accumType = accumulatorType ?? inputType.GetAccumulatingType(); + + // Handle scalar case - just return the value (possibly converted) + if (arr.Shape.IsScalar) + { + return ExecuteScalarReduction(arr, op, accumType); + } + + // Determine if array is contiguous + bool isContiguous = arr.Shape.IsContiguous; + + // Get kernel key + var key = new ElementReductionKernelKey(inputType, accumType, op, isContiguous); + + // Get or generate kernel + var kernel = ILKernelGenerator.TryGetTypedElementReductionKernel(key); + + if (kernel != null) + { + return ExecuteTypedReductionKernel(kernel, arr); + } + else + { + // Fallback - should not happen for implemented operations + throw new NotSupportedException( + $"IL kernel not available for {op}({inputType}) -> {accumType}. " + + "Please report this as a bug."); + } + } + + /// + /// Execute scalar reduction - just return the value, possibly converted. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static TResult ExecuteScalarReduction(in NDArray arr, ReductionOp op, NPTypeCode accumType) + where TResult : unmanaged + { + // For ArgMax/ArgMin of scalar, index is 0 + if (op == ReductionOp.ArgMax || op == ReductionOp.ArgMin) + { + return (TResult)(object)0; + } + + // For other ops, return the scalar value converted to result type + var value = arr.GetAtIndex(0); + return (TResult)Converts.ChangeType(value, typeof(TResult).GetTypeCode()); + } + + /// + /// Execute the IL-generated typed reduction kernel. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static unsafe TResult ExecuteTypedReductionKernel( + TypedElementReductionKernel kernel, + in NDArray input) + where TResult : unmanaged + { + int inputElemSize = input.dtypesize; + var inputShape = input.Shape; + + // Calculate base address accounting for shape offset (for sliced views) + byte* inputAddr = (byte*)input.Address + inputShape.offset * inputElemSize; + + fixed (int* strides = inputShape.strides) + fixed (int* shape = inputShape.dimensions) + { + return kernel( + (void*)inputAddr, + strides, + shape, + input.ndim, + input.size + ); + } + } + + #region Type-Specific Element Reduction Wrappers + + /// + /// Execute element-wise sum reduction using IL kernels. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + protected object sum_elementwise_il(NDArray arr, NPTypeCode? typeCode) + { + if (arr.Shape.IsScalar || (arr.Shape.NDim == 1 && arr.Shape.size == 1)) + return typeCode.HasValue ? Converts.ChangeType(arr.GetAtIndex(0), typeCode.Value) : arr.GetAtIndex(0); + + var retType = typeCode ?? arr.GetTypeCode.GetAccumulatingType(); + + return retType switch + { + NPTypeCode.Byte => ExecuteElementReduction(arr, ReductionOp.Sum, retType), + NPTypeCode.Int16 => ExecuteElementReduction(arr, ReductionOp.Sum, retType), + NPTypeCode.UInt16 => ExecuteElementReduction(arr, ReductionOp.Sum, retType), + NPTypeCode.Int32 => ExecuteElementReduction(arr, ReductionOp.Sum, retType), + NPTypeCode.UInt32 => ExecuteElementReduction(arr, ReductionOp.Sum, retType), + NPTypeCode.Int64 => ExecuteElementReduction(arr, ReductionOp.Sum, retType), + NPTypeCode.UInt64 => ExecuteElementReduction(arr, ReductionOp.Sum, retType), + NPTypeCode.Single => ExecuteElementReduction(arr, ReductionOp.Sum, retType), + NPTypeCode.Double => ExecuteElementReduction(arr, ReductionOp.Sum, retType), + NPTypeCode.Decimal => ExecuteElementReduction(arr, ReductionOp.Sum, retType), + _ => throw new NotSupportedException($"Sum not supported for type {retType}") + }; + } + + /// + /// Execute element-wise product reduction using IL kernels. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + protected object prod_elementwise_il(NDArray arr, NPTypeCode? typeCode) + { + if (arr.Shape.IsScalar || (arr.Shape.NDim == 1 && arr.Shape.size == 1)) + return typeCode.HasValue ? Converts.ChangeType(arr.GetAtIndex(0), typeCode.Value) : arr.GetAtIndex(0); + + var retType = typeCode ?? arr.GetTypeCode.GetAccumulatingType(); + + return retType switch + { + NPTypeCode.Byte => ExecuteElementReduction(arr, ReductionOp.Prod, retType), + NPTypeCode.Int16 => ExecuteElementReduction(arr, ReductionOp.Prod, retType), + NPTypeCode.UInt16 => ExecuteElementReduction(arr, ReductionOp.Prod, retType), + NPTypeCode.Int32 => ExecuteElementReduction(arr, ReductionOp.Prod, retType), + NPTypeCode.UInt32 => ExecuteElementReduction(arr, ReductionOp.Prod, retType), + NPTypeCode.Int64 => ExecuteElementReduction(arr, ReductionOp.Prod, retType), + NPTypeCode.UInt64 => ExecuteElementReduction(arr, ReductionOp.Prod, retType), + NPTypeCode.Single => ExecuteElementReduction(arr, ReductionOp.Prod, retType), + NPTypeCode.Double => ExecuteElementReduction(arr, ReductionOp.Prod, retType), + NPTypeCode.Decimal => ExecuteElementReduction(arr, ReductionOp.Prod, retType), + _ => throw new NotSupportedException($"Prod not supported for type {retType}") + }; + } + + /// + /// Execute element-wise max reduction using IL kernels. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + protected object max_elementwise_il(NDArray arr, NPTypeCode? typeCode) + { + if (arr.Shape.IsScalar || (arr.Shape.NDim == 1 && arr.Shape.size == 1)) + return typeCode.HasValue ? Converts.ChangeType(arr.GetAtIndex(0), typeCode.Value) : arr.GetAtIndex(0); + + var retType = typeCode ?? arr.GetTypeCode; + + return retType switch + { + NPTypeCode.Byte => ExecuteElementReduction(arr, ReductionOp.Max, retType), + NPTypeCode.Int16 => ExecuteElementReduction(arr, ReductionOp.Max, retType), + NPTypeCode.UInt16 => ExecuteElementReduction(arr, ReductionOp.Max, retType), + NPTypeCode.Int32 => ExecuteElementReduction(arr, ReductionOp.Max, retType), + NPTypeCode.UInt32 => ExecuteElementReduction(arr, ReductionOp.Max, retType), + NPTypeCode.Int64 => ExecuteElementReduction(arr, ReductionOp.Max, retType), + NPTypeCode.UInt64 => ExecuteElementReduction(arr, ReductionOp.Max, retType), + NPTypeCode.Single => ExecuteElementReduction(arr, ReductionOp.Max, retType), + NPTypeCode.Double => ExecuteElementReduction(arr, ReductionOp.Max, retType), + NPTypeCode.Decimal => ExecuteElementReduction(arr, ReductionOp.Max, retType), + _ => throw new NotSupportedException($"Max not supported for type {retType}") + }; + } + + /// + /// Execute element-wise min reduction using IL kernels. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + protected object min_elementwise_il(NDArray arr, NPTypeCode? typeCode) + { + if (arr.Shape.IsScalar || (arr.Shape.NDim == 1 && arr.Shape.size == 1)) + return typeCode.HasValue ? Converts.ChangeType(arr.GetAtIndex(0), typeCode.Value) : arr.GetAtIndex(0); + + var retType = typeCode ?? arr.GetTypeCode; + + return retType switch + { + NPTypeCode.Byte => ExecuteElementReduction(arr, ReductionOp.Min, retType), + NPTypeCode.Int16 => ExecuteElementReduction(arr, ReductionOp.Min, retType), + NPTypeCode.UInt16 => ExecuteElementReduction(arr, ReductionOp.Min, retType), + NPTypeCode.Int32 => ExecuteElementReduction(arr, ReductionOp.Min, retType), + NPTypeCode.UInt32 => ExecuteElementReduction(arr, ReductionOp.Min, retType), + NPTypeCode.Int64 => ExecuteElementReduction(arr, ReductionOp.Min, retType), + NPTypeCode.UInt64 => ExecuteElementReduction(arr, ReductionOp.Min, retType), + NPTypeCode.Single => ExecuteElementReduction(arr, ReductionOp.Min, retType), + NPTypeCode.Double => ExecuteElementReduction(arr, ReductionOp.Min, retType), + NPTypeCode.Decimal => ExecuteElementReduction(arr, ReductionOp.Min, retType), + _ => throw new NotSupportedException($"Min not supported for type {retType}") + }; + } + + /// + /// Execute element-wise argmax reduction using IL kernels. + /// Returns the index of the maximum value. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + protected int argmax_elementwise_il(NDArray arr) + { + if (arr.Shape.IsScalar || (arr.Shape.NDim == 1 && arr.Shape.size == 1)) + return 0; + + var inputType = arr.GetTypeCode; + + // ArgMax always returns int, but needs accumulator type for comparison + return inputType switch + { + NPTypeCode.Byte => ExecuteElementReduction(arr, ReductionOp.ArgMax, NPTypeCode.Byte), + NPTypeCode.Int16 => ExecuteElementReduction(arr, ReductionOp.ArgMax, NPTypeCode.Int16), + NPTypeCode.UInt16 => ExecuteElementReduction(arr, ReductionOp.ArgMax, NPTypeCode.UInt16), + NPTypeCode.Int32 => ExecuteElementReduction(arr, ReductionOp.ArgMax, NPTypeCode.Int32), + NPTypeCode.UInt32 => ExecuteElementReduction(arr, ReductionOp.ArgMax, NPTypeCode.UInt32), + NPTypeCode.Int64 => ExecuteElementReduction(arr, ReductionOp.ArgMax, NPTypeCode.Int64), + NPTypeCode.UInt64 => ExecuteElementReduction(arr, ReductionOp.ArgMax, NPTypeCode.UInt64), + NPTypeCode.Single => ExecuteElementReduction(arr, ReductionOp.ArgMax, NPTypeCode.Single), + NPTypeCode.Double => ExecuteElementReduction(arr, ReductionOp.ArgMax, NPTypeCode.Double), + NPTypeCode.Decimal => ExecuteElementReduction(arr, ReductionOp.ArgMax, NPTypeCode.Decimal), + _ => throw new NotSupportedException($"ArgMax not supported for type {inputType}") + }; + } + + /// + /// Execute element-wise argmin reduction using IL kernels. + /// Returns the index of the minimum value. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + protected int argmin_elementwise_il(NDArray arr) + { + if (arr.Shape.IsScalar || (arr.Shape.NDim == 1 && arr.Shape.size == 1)) + return 0; + + var inputType = arr.GetTypeCode; + + // ArgMin always returns int, but needs accumulator type for comparison + return inputType switch + { + NPTypeCode.Byte => ExecuteElementReduction(arr, ReductionOp.ArgMin, NPTypeCode.Byte), + NPTypeCode.Int16 => ExecuteElementReduction(arr, ReductionOp.ArgMin, NPTypeCode.Int16), + NPTypeCode.UInt16 => ExecuteElementReduction(arr, ReductionOp.ArgMin, NPTypeCode.UInt16), + NPTypeCode.Int32 => ExecuteElementReduction(arr, ReductionOp.ArgMin, NPTypeCode.Int32), + NPTypeCode.UInt32 => ExecuteElementReduction(arr, ReductionOp.ArgMin, NPTypeCode.UInt32), + NPTypeCode.Int64 => ExecuteElementReduction(arr, ReductionOp.ArgMin, NPTypeCode.Int64), + NPTypeCode.UInt64 => ExecuteElementReduction(arr, ReductionOp.ArgMin, NPTypeCode.UInt64), + NPTypeCode.Single => ExecuteElementReduction(arr, ReductionOp.ArgMin, NPTypeCode.Single), + NPTypeCode.Double => ExecuteElementReduction(arr, ReductionOp.ArgMin, NPTypeCode.Double), + NPTypeCode.Decimal => ExecuteElementReduction(arr, ReductionOp.ArgMin, NPTypeCode.Decimal), + _ => throw new NotSupportedException($"ArgMin not supported for type {inputType}") + }; + } + + /// + /// Execute element-wise mean using IL kernels for sum. + /// Mean = Sum / count + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + protected object mean_elementwise_il(NDArray arr, NPTypeCode? typeCode) + { + if (arr.Shape.IsScalar || (arr.Shape.NDim == 1 && arr.Shape.size == 1)) + { + var val = arr.GetAtIndex(0); + return typeCode.HasValue ? Converts.ChangeType(val, typeCode.Value) : Convert.ToDouble(val); + } + + // Mean always computes in double for precision + var retType = typeCode ?? NPTypeCode.Double; + int count = arr.size; + + // Sum in accumulating type, then divide + var sumType = arr.GetTypeCode.GetAccumulatingType(); + + double sum = sumType switch + { + NPTypeCode.Int32 => ExecuteElementReduction(arr, ReductionOp.Sum, sumType), + NPTypeCode.UInt32 => ExecuteElementReduction(arr, ReductionOp.Sum, sumType), + NPTypeCode.Int64 => ExecuteElementReduction(arr, ReductionOp.Sum, sumType), + NPTypeCode.UInt64 => ExecuteElementReduction(arr, ReductionOp.Sum, sumType), + NPTypeCode.Single => ExecuteElementReduction(arr, ReductionOp.Sum, sumType), + NPTypeCode.Double => ExecuteElementReduction(arr, ReductionOp.Sum, sumType), + NPTypeCode.Decimal => (double)ExecuteElementReduction(arr, ReductionOp.Sum, sumType), + _ => throw new NotSupportedException($"Mean not supported for accumulator type {sumType}") + }; + + double mean = sum / count; + return Converts.ChangeType(mean, retType); + } + + #endregion + } +} diff --git a/src/NumSharp.Core/Backends/Default/Math/DefaultEngine.UnaryOp.cs b/src/NumSharp.Core/Backends/Default/Math/DefaultEngine.UnaryOp.cs new file mode 100644 index 00000000..8d703fd3 --- /dev/null +++ b/src/NumSharp.Core/Backends/Default/Math/DefaultEngine.UnaryOp.cs @@ -0,0 +1,164 @@ +using System; +using System.Runtime.CompilerServices; +using NumSharp.Backends.Kernels; +using NumSharp.Utilities; + +namespace NumSharp.Backends +{ + /// + /// Unary operation dispatch using IL-generated kernels. + /// + public partial class DefaultEngine + { + /// + /// Execute a unary operation using IL-generated kernels. + /// Handles type promotion, strided arrays, and kernel dispatch. + /// + /// Input array + /// Operation to perform + /// Optional output type (null = same as input or float for trig/sqrt) + /// Result array with specified or promoted type + [MethodImpl(MethodImplOptions.AggressiveOptimization)] + internal unsafe NDArray ExecuteUnaryOp(in NDArray nd, UnaryOp op, NPTypeCode? typeCode = null) + { + if (nd.size == 0) + return nd.Clone(); + + var inputType = nd.GetTypeCode; + + // Determine output type: + // - If explicit type provided, use it directly + // - For trig/math functions (Sin, Cos, Exp, Log, Sqrt), use ResolveUnaryReturnType (promotes to float) + // - For arithmetic functions (Negate, Abs), preserve input type + NPTypeCode outputType; + if (typeCode.HasValue) + { + outputType = typeCode.Value; + } + else if (op == UnaryOp.Negate || op == UnaryOp.Abs) + { + // Arithmetic operations preserve type + outputType = inputType; + } + else + { + // Math functions promote to computing type (typically float/double) + outputType = ResolveUnaryReturnType(nd, (NPTypeCode?)null); + } + + // Handle scalar case + if (nd.Shape.IsScalar) + { + return ExecuteScalarUnary(nd, op, outputType); + } + + // Determine if array is contiguous + bool isContiguous = nd.Shape.IsContiguous; + + // Allocate result (always contiguous) + var result = new NDArray(outputType, nd.Shape.Clean(), false); + + // Get kernel key + var key = new UnaryKernelKey(inputType, outputType, op, isContiguous); + + // Get or generate kernel + var kernel = ILKernelGenerator.TryGetUnaryKernel(key); + + if (kernel != null) + { + // Execute IL kernel + ExecuteUnaryKernel(kernel, nd, result); + } + else + { + // Fallback - should not happen for implemented operations + throw new NotSupportedException( + $"IL kernel not available for {op}({inputType}) -> {outputType}. " + + "Please report this as a bug."); + } + + return result; + } + + /// + /// Execute scalar unary operation using IL-generated delegate. + /// + private NDArray ExecuteScalarUnary(in NDArray nd, UnaryOp op, NPTypeCode outputType) + { + var inputType = nd.GetTypeCode; + var key = new UnaryScalarKernelKey(inputType, outputType, op); + var func = ILKernelGenerator.GetUnaryScalarDelegate(key); + + // Dispatch based on input type to avoid boxing + return inputType switch + { + NPTypeCode.Boolean => InvokeUnaryScalar(func, nd.GetBoolean(), outputType), + NPTypeCode.Byte => InvokeUnaryScalar(func, nd.GetByte(), outputType), + NPTypeCode.Int16 => InvokeUnaryScalar(func, nd.GetInt16(), outputType), + NPTypeCode.UInt16 => InvokeUnaryScalar(func, nd.GetUInt16(), outputType), + NPTypeCode.Int32 => InvokeUnaryScalar(func, nd.GetInt32(), outputType), + NPTypeCode.UInt32 => InvokeUnaryScalar(func, nd.GetUInt32(), outputType), + NPTypeCode.Int64 => InvokeUnaryScalar(func, nd.GetInt64(), outputType), + NPTypeCode.UInt64 => InvokeUnaryScalar(func, nd.GetUInt64(), outputType), + NPTypeCode.Char => InvokeUnaryScalar(func, nd.GetChar(), outputType), + NPTypeCode.Single => InvokeUnaryScalar(func, nd.GetSingle(), outputType), + NPTypeCode.Double => InvokeUnaryScalar(func, nd.GetDouble(), outputType), + NPTypeCode.Decimal => InvokeUnaryScalar(func, nd.GetDecimal(), outputType), + _ => throw new NotSupportedException($"Input type {inputType} not supported") + }; + } + + /// + /// Invoke a unary scalar delegate and create the result NDArray. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static NDArray InvokeUnaryScalar(Delegate func, TInput input, NPTypeCode outputType) + { + // Dispatch based on output type to avoid boxing on result + return outputType switch + { + NPTypeCode.Boolean => NDArray.Scalar(((Func)func)(input)), + NPTypeCode.Byte => NDArray.Scalar(((Func)func)(input)), + NPTypeCode.Int16 => NDArray.Scalar(((Func)func)(input)), + NPTypeCode.UInt16 => NDArray.Scalar(((Func)func)(input)), + NPTypeCode.Int32 => NDArray.Scalar(((Func)func)(input)), + NPTypeCode.UInt32 => NDArray.Scalar(((Func)func)(input)), + NPTypeCode.Int64 => NDArray.Scalar(((Func)func)(input)), + NPTypeCode.UInt64 => NDArray.Scalar(((Func)func)(input)), + NPTypeCode.Char => NDArray.Scalar(((Func)func)(input)), + NPTypeCode.Single => NDArray.Scalar(((Func)func)(input)), + NPTypeCode.Double => NDArray.Scalar(((Func)func)(input)), + NPTypeCode.Decimal => NDArray.Scalar(((Func)func)(input)), + _ => throw new NotSupportedException($"Output type {outputType} not supported") + }; + } + + /// + /// Execute the IL-generated unary kernel. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static unsafe void ExecuteUnaryKernel( + UnaryKernel kernel, + in NDArray input, NDArray result) + { + int inputElemSize = input.dtypesize; + var inputShape = input.Shape; + + // Calculate base address accounting for shape offset (for sliced views) + byte* inputAddr = (byte*)input.Address + inputShape.offset * inputElemSize; + + fixed (int* strides = inputShape.strides) + fixed (int* shape = result.shape) + { + kernel( + (void*)inputAddr, + (void*)result.Address, + strides, + shape, + result.ndim, + result.size + ); + } + } + } +} diff --git a/src/NumSharp.Core/Backends/Default/Math/Divide/Default.Divide.Boolean.cs b/src/NumSharp.Core/Backends/Default/Math/Divide/Default.Divide.Boolean.cs deleted file mode 100644 index 648f1ddd..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Divide/Default.Divide.Boolean.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray DivideBoolean(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of bool - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Divide" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((bool*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("bool"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((bool*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToByte(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToByte(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToByte(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToByte(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToByte(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToByte(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToByte(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToByte(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt16(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt16(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt16(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt16(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToInt16(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt16(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToInt16(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToInt16(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt16(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt16(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt16(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt16(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToUInt16(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt16(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToUInt16(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToUInt16(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt32(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt32(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt32(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt32(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToInt32(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt32(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToInt32(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToInt32(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt32(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt32(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt32(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt32(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToUInt32(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt32(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToUInt32(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToUInt32(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt64(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt64(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt64(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt64(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToInt64(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt64(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToInt64(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToInt64(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt64(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt64(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt64(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt64(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToUInt64(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt64(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToUInt64(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToUInt64(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToChar(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToChar(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToChar(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToChar(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToChar(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToChar(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToChar(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToChar(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDouble(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDouble(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDouble(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDouble(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToDouble(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDouble(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToDouble(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToDouble(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToSingle(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToSingle(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToSingle(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToSingle(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToSingle(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToSingle(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToSingle(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToSingle(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDecimal(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDecimal(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDecimal(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDecimal(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToDecimal(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDecimal(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToDecimal(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToDecimal(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((bool*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((bool*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((bool*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((bool*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((bool*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((bool*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((bool*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((bool*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((bool*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((bool*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((bool*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Divide/Default.Divide.Byte.cs b/src/NumSharp.Core/Backends/Default/Math/Divide/Default.Divide.Byte.cs deleted file mode 100644 index f448d63b..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Divide/Default.Divide.Byte.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray DivideByte(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of byte - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Divide" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((byte*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("byte"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((byte*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((byte*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((byte*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((byte*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((byte*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((byte*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((byte*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((byte*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((byte*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((byte*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((byte*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((byte*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Divide/Default.Divide.Char.cs b/src/NumSharp.Core/Backends/Default/Math/Divide/Default.Divide.Char.cs deleted file mode 100644 index e6fe7330..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Divide/Default.Divide.Char.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray DivideChar(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of char - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Divide" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((char*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("char"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((char*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((char*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((char*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((char*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((char*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((char*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((char*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((char*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((char*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((char*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((char*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((char*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Divide/Default.Divide.Decimal.cs b/src/NumSharp.Core/Backends/Default/Math/Divide/Default.Divide.Decimal.cs deleted file mode 100644 index c7ba96e0..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Divide/Default.Divide.Decimal.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray DivideDecimal(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of decimal - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Divide" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((decimal*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("decimal"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((decimal*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((decimal*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((decimal*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((decimal*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((decimal*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((decimal*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((decimal*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((decimal*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((decimal*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((decimal*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((decimal*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((decimal*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Divide/Default.Divide.Double.cs b/src/NumSharp.Core/Backends/Default/Math/Divide/Default.Divide.Double.cs deleted file mode 100644 index 151c0fc2..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Divide/Default.Divide.Double.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray DivideDouble(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of double - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Divide" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((double*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("double"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((double*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((double*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((double*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((double*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((double*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((double*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((double*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((double*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((double*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((double*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((double*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((double*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Divide/Default.Divide.Int16.cs b/src/NumSharp.Core/Backends/Default/Math/Divide/Default.Divide.Int16.cs deleted file mode 100644 index 20faf165..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Divide/Default.Divide.Int16.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray DivideInt16(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of short - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Divide" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((short*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("short"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((short*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((short*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((short*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((short*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((short*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((short*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((short*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((short*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((short*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((short*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((short*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((short*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Divide/Default.Divide.Int32.cs b/src/NumSharp.Core/Backends/Default/Math/Divide/Default.Divide.Int32.cs deleted file mode 100644 index 735f5111..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Divide/Default.Divide.Int32.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray DivideInt32(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of int - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Divide" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((int*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("int"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((int*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((int*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((int*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((int*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((int*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((int*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((int*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((int*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((int*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((int*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((int*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((int*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Divide/Default.Divide.Int64.cs b/src/NumSharp.Core/Backends/Default/Math/Divide/Default.Divide.Int64.cs deleted file mode 100644 index ce6cdc78..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Divide/Default.Divide.Int64.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray DivideInt64(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of long - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Divide" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((long*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("long"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((long*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((long*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((long*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((long*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((long*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((long*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((long*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((long*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((long*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((long*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((long*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((long*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Divide/Default.Divide.Single.cs b/src/NumSharp.Core/Backends/Default/Math/Divide/Default.Divide.Single.cs deleted file mode 100644 index 72137bd1..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Divide/Default.Divide.Single.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray DivideSingle(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of float - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Divide" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((float*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("float"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((float*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((float*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((float*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((float*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((float*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((float*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((float*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((float*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((float*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((float*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((float*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((float*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Divide/Default.Divide.UInt16.cs b/src/NumSharp.Core/Backends/Default/Math/Divide/Default.Divide.UInt16.cs deleted file mode 100644 index af461bb9..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Divide/Default.Divide.UInt16.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray DivideUInt16(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of ushort - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Divide" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((ushort*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("ushort"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((ushort*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((ushort*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((ushort*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((ushort*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((ushort*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((ushort*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((ushort*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((ushort*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((ushort*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((ushort*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((ushort*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((ushort*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Divide/Default.Divide.UInt32.cs b/src/NumSharp.Core/Backends/Default/Math/Divide/Default.Divide.UInt32.cs deleted file mode 100644 index 0b852776..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Divide/Default.Divide.UInt32.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray DivideUInt32(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of uint - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Divide" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((uint*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("uint"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((uint*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((uint*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((uint*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((uint*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((uint*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((uint*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((uint*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((uint*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((uint*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((uint*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((uint*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((uint*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Divide/Default.Divide.UInt64.cs b/src/NumSharp.Core/Backends/Default/Math/Divide/Default.Divide.UInt64.cs deleted file mode 100644 index 537f2f35..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Divide/Default.Divide.UInt64.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray DivideUInt64(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of ulong - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Divide" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((ulong*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("ulong"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((ulong*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((ulong*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((ulong*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((ulong*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((ulong*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((ulong*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((ulong*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((ulong*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((ulong*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((ulong*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((ulong*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Divide(*((ulong*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Divide(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Divide((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Mod/Default.Mod.Boolean.cs b/src/NumSharp.Core/Backends/Default/Math/Mod/Default.Mod.Boolean.cs deleted file mode 100644 index 994f7f35..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Mod/Default.Mod.Boolean.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray ModBoolean(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of bool - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Mod" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((bool*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("bool"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((bool*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToByte(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToByte(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToByte(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToByte(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToByte(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToByte(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToByte(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToByte(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt16(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt16(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt16(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt16(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToInt16(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt16(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToInt16(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToInt16(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt16(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt16(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt16(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt16(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToUInt16(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt16(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToUInt16(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToUInt16(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt32(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt32(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt32(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt32(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToInt32(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt32(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToInt32(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToInt32(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt32(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt32(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt32(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt32(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToUInt32(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt32(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToUInt32(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToUInt32(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt64(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt64(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt64(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt64(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToInt64(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt64(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToInt64(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToInt64(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt64(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt64(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt64(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt64(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToUInt64(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt64(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToUInt64(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToUInt64(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToChar(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToChar(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToChar(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToChar(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToChar(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToChar(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToChar(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToChar(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDouble(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDouble(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDouble(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDouble(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToDouble(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDouble(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToDouble(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToDouble(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToSingle(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToSingle(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToSingle(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToSingle(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToSingle(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToSingle(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToSingle(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToSingle(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDecimal(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDecimal(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDecimal(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDecimal(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToDecimal(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDecimal(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToDecimal(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToDecimal(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((bool*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((bool*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((bool*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((bool*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((bool*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((bool*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((bool*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((bool*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((bool*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((bool*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((bool*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Mod/Default.Mod.Byte.cs b/src/NumSharp.Core/Backends/Default/Math/Mod/Default.Mod.Byte.cs deleted file mode 100644 index 11d22a62..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Mod/Default.Mod.Byte.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray ModByte(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of byte - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Mod" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((byte*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("byte"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((byte*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((byte*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((byte*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((byte*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((byte*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((byte*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((byte*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((byte*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((byte*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((byte*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((byte*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((byte*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Mod/Default.Mod.Char.cs b/src/NumSharp.Core/Backends/Default/Math/Mod/Default.Mod.Char.cs deleted file mode 100644 index ad067530..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Mod/Default.Mod.Char.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray ModChar(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of char - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Mod" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((char*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("char"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((char*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((char*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((char*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((char*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((char*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((char*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((char*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((char*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((char*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((char*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((char*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((char*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Mod/Default.Mod.Decimal.cs b/src/NumSharp.Core/Backends/Default/Math/Mod/Default.Mod.Decimal.cs deleted file mode 100644 index 324a4bb7..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Mod/Default.Mod.Decimal.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray ModDecimal(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of decimal - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Mod" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((decimal*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("decimal"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((decimal*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((decimal*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((decimal*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((decimal*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((decimal*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((decimal*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((decimal*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((decimal*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((decimal*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((decimal*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((decimal*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((decimal*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Mod/Default.Mod.Double.cs b/src/NumSharp.Core/Backends/Default/Math/Mod/Default.Mod.Double.cs deleted file mode 100644 index a686d028..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Mod/Default.Mod.Double.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray ModDouble(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of double - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Mod" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((double*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("double"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((double*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((double*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((double*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((double*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((double*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((double*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((double*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((double*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((double*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((double*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((double*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((double*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Mod/Default.Mod.Int16.cs b/src/NumSharp.Core/Backends/Default/Math/Mod/Default.Mod.Int16.cs deleted file mode 100644 index 22356c32..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Mod/Default.Mod.Int16.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray ModInt16(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of short - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Mod" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((short*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("short"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((short*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((short*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((short*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((short*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((short*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((short*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((short*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((short*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((short*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((short*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((short*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((short*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Mod/Default.Mod.Int32.cs b/src/NumSharp.Core/Backends/Default/Math/Mod/Default.Mod.Int32.cs deleted file mode 100644 index 1c65c62d..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Mod/Default.Mod.Int32.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray ModInt32(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of int - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Mod" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((int*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("int"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((int*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((int*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((int*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((int*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((int*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((int*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((int*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((int*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((int*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((int*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((int*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((int*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Mod/Default.Mod.Int64.cs b/src/NumSharp.Core/Backends/Default/Math/Mod/Default.Mod.Int64.cs deleted file mode 100644 index 809fac77..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Mod/Default.Mod.Int64.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray ModInt64(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of long - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Mod" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((long*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("long"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((long*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((long*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((long*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((long*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((long*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((long*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((long*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((long*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((long*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((long*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((long*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((long*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Mod/Default.Mod.Single.cs b/src/NumSharp.Core/Backends/Default/Math/Mod/Default.Mod.Single.cs deleted file mode 100644 index 2c6fd25a..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Mod/Default.Mod.Single.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray ModSingle(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of float - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Mod" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((float*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("float"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((float*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((float*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((float*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((float*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((float*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((float*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((float*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((float*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((float*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((float*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((float*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((float*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Mod/Default.Mod.UInt16.cs b/src/NumSharp.Core/Backends/Default/Math/Mod/Default.Mod.UInt16.cs deleted file mode 100644 index 48357c47..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Mod/Default.Mod.UInt16.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray ModUInt16(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of ushort - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Mod" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((ushort*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("ushort"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((ushort*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((ushort*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((ushort*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((ushort*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((ushort*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((ushort*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((ushort*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((ushort*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((ushort*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((ushort*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((ushort*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((ushort*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Mod/Default.Mod.UInt32.cs b/src/NumSharp.Core/Backends/Default/Math/Mod/Default.Mod.UInt32.cs deleted file mode 100644 index ce46c202..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Mod/Default.Mod.UInt32.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray ModUInt32(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of uint - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Mod" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((uint*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("uint"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((uint*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((uint*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((uint*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((uint*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((uint*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((uint*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((uint*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((uint*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((uint*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((uint*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((uint*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((uint*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Mod/Default.Mod.UInt64.cs b/src/NumSharp.Core/Backends/Default/Math/Mod/Default.Mod.UInt64.cs deleted file mode 100644 index 52362279..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Mod/Default.Mod.UInt64.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray ModUInt64(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of ulong - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Mod" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((ulong*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("ulong"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((ulong*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((ulong*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((ulong*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((ulong*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((ulong*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((ulong*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((ulong*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((ulong*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((ulong*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((ulong*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((ulong*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Mod(*((ulong*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Mod(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Mod((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Multiply/Default.Multiply.Boolean.cs b/src/NumSharp.Core/Backends/Default/Math/Multiply/Default.Multiply.Boolean.cs deleted file mode 100644 index 2af0ceb0..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Multiply/Default.Multiply.Boolean.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray MultiplyBoolean(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of bool - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Multiply" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((bool*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("bool"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((bool*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToByte(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToByte(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToByte(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToByte(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToByte(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToByte(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToByte(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToByte(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt16(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt16(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt16(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt16(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToInt16(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt16(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToInt16(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToInt16(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt16(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt16(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt16(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt16(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToUInt16(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt16(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToUInt16(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToUInt16(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt32(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt32(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt32(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt32(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToInt32(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt32(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToInt32(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToInt32(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt32(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt32(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt32(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt32(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToUInt32(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt32(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToUInt32(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToUInt32(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt64(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt64(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt64(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt64(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToInt64(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt64(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToInt64(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToInt64(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt64(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt64(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt64(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt64(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToUInt64(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt64(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToUInt64(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToUInt64(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToChar(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToChar(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToChar(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToChar(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToChar(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToChar(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToChar(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToChar(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDouble(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDouble(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDouble(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDouble(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToDouble(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDouble(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToDouble(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToDouble(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToSingle(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToSingle(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToSingle(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToSingle(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToSingle(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToSingle(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToSingle(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToSingle(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDecimal(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDecimal(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDecimal(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDecimal(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToDecimal(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDecimal(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToDecimal(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToDecimal(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((bool*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((bool*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((bool*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((bool*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((bool*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((bool*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((bool*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((bool*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((bool*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((bool*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((bool*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Multiply/Default.Multiply.Byte.cs b/src/NumSharp.Core/Backends/Default/Math/Multiply/Default.Multiply.Byte.cs deleted file mode 100644 index 483cd848..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Multiply/Default.Multiply.Byte.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray MultiplyByte(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of byte - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Multiply" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((byte*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("byte"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((byte*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((byte*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((byte*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((byte*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((byte*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((byte*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((byte*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((byte*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((byte*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((byte*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((byte*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((byte*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Multiply/Default.Multiply.Char.cs b/src/NumSharp.Core/Backends/Default/Math/Multiply/Default.Multiply.Char.cs deleted file mode 100644 index 924b85a9..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Multiply/Default.Multiply.Char.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray MultiplyChar(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of char - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Multiply" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((char*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("char"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((char*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((char*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((char*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((char*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((char*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((char*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((char*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((char*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((char*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((char*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((char*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((char*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Multiply/Default.Multiply.Decimal.cs b/src/NumSharp.Core/Backends/Default/Math/Multiply/Default.Multiply.Decimal.cs deleted file mode 100644 index fe8177ed..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Multiply/Default.Multiply.Decimal.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray MultiplyDecimal(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of decimal - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Multiply" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((decimal*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("decimal"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((decimal*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((decimal*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((decimal*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((decimal*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((decimal*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((decimal*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((decimal*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((decimal*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((decimal*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((decimal*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((decimal*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((decimal*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Multiply/Default.Multiply.Double.cs b/src/NumSharp.Core/Backends/Default/Math/Multiply/Default.Multiply.Double.cs deleted file mode 100644 index 8ac47f9c..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Multiply/Default.Multiply.Double.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray MultiplyDouble(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of double - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Multiply" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((double*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("double"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((double*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((double*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((double*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((double*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((double*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((double*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((double*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((double*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((double*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((double*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((double*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((double*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Multiply/Default.Multiply.Int16.cs b/src/NumSharp.Core/Backends/Default/Math/Multiply/Default.Multiply.Int16.cs deleted file mode 100644 index 37baeec5..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Multiply/Default.Multiply.Int16.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray MultiplyInt16(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of short - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Multiply" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((short*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("short"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((short*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((short*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((short*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((short*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((short*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((short*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((short*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((short*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((short*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((short*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((short*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((short*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Multiply/Default.Multiply.Int32.cs b/src/NumSharp.Core/Backends/Default/Math/Multiply/Default.Multiply.Int32.cs deleted file mode 100644 index 39398974..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Multiply/Default.Multiply.Int32.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray MultiplyInt32(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of int - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Multiply" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((int*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("int"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((int*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((int*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((int*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((int*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((int*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((int*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((int*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((int*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((int*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((int*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((int*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((int*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Multiply/Default.Multiply.Int64.cs b/src/NumSharp.Core/Backends/Default/Math/Multiply/Default.Multiply.Int64.cs deleted file mode 100644 index fc4eafb2..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Multiply/Default.Multiply.Int64.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray MultiplyInt64(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of long - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Multiply" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((long*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("long"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((long*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((long*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((long*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((long*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((long*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((long*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((long*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((long*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((long*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((long*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((long*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((long*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Multiply/Default.Multiply.Single.cs b/src/NumSharp.Core/Backends/Default/Math/Multiply/Default.Multiply.Single.cs deleted file mode 100644 index 8395520c..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Multiply/Default.Multiply.Single.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray MultiplySingle(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of float - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Multiply" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((float*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("float"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((float*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((float*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((float*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((float*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((float*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((float*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((float*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((float*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((float*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((float*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((float*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((float*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Multiply/Default.Multiply.UInt16.cs b/src/NumSharp.Core/Backends/Default/Math/Multiply/Default.Multiply.UInt16.cs deleted file mode 100644 index bf0efb3c..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Multiply/Default.Multiply.UInt16.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray MultiplyUInt16(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of ushort - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Multiply" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((ushort*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("ushort"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((ushort*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((ushort*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((ushort*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((ushort*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((ushort*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((ushort*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((ushort*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((ushort*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((ushort*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((ushort*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((ushort*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((ushort*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Multiply/Default.Multiply.UInt32.cs b/src/NumSharp.Core/Backends/Default/Math/Multiply/Default.Multiply.UInt32.cs deleted file mode 100644 index 7be49267..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Multiply/Default.Multiply.UInt32.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray MultiplyUInt32(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of uint - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Multiply" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((uint*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("uint"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((uint*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((uint*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((uint*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((uint*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((uint*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((uint*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((uint*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((uint*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((uint*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((uint*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((uint*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((uint*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Multiply/Default.Multiply.UInt64.cs b/src/NumSharp.Core/Backends/Default/Math/Multiply/Default.Multiply.UInt64.cs deleted file mode 100644 index 5c021cc7..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Multiply/Default.Multiply.UInt64.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray MultiplyUInt64(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of ulong - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Multiply" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((ulong*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("ulong"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((ulong*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((ulong*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((ulong*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((ulong*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((ulong*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((ulong*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((ulong*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((ulong*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((ulong*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((ulong*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((ulong*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Multiply(*((ulong*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Multiply(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Multiply((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.AMax.cs b/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.AMax.cs index c06d591a..d3062606 100644 --- a/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.AMax.cs +++ b/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.AMax.cs @@ -34,7 +34,8 @@ public override NDArray ReduceAMax(NDArray arr, int? axis_, bool keepdims = fals if (axis_ == null) { - var r = NDArray.Scalar(amax_elementwise(arr, typeCode)); + // Use IL-generated kernels for element-wise reduction + var r = NDArray.Scalar(max_elementwise_il(arr, typeCode)); if (keepdims) { // NumPy: keepdims preserves the number of dimensions, all set to 1 diff --git a/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.AMin.cs b/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.AMin.cs index 526a768e..a58cadbe 100644 --- a/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.AMin.cs +++ b/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.AMin.cs @@ -34,7 +34,8 @@ public override NDArray ReduceAMin(NDArray arr, int? axis_, bool keepdims = fals if (axis_ == null) { - var r = NDArray.Scalar(amin_elementwise(arr, typeCode)); + // Use IL-generated kernels for element-wise reduction + var r = NDArray.Scalar(min_elementwise_il(arr, typeCode)); if (keepdims) { // NumPy: keepdims preserves the number of dimensions, all set to 1 diff --git a/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.Add.cs b/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.Add.cs index ccbc41d0..9a1e3dd5 100644 --- a/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.Add.cs +++ b/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.Add.cs @@ -49,13 +49,14 @@ public override NDArray ReduceAdd(in NDArray arr, int? axis_, bool keepdims = fa //handle element-wise (no axis specified) if (axis_ == null) { + // Use IL-generated kernels for element-wise reduction if (!(@out is null)) { - @out.SetAtIndex(sum_elementwise(arr, typeCode), 0); + @out.SetAtIndex(sum_elementwise_il(arr, typeCode), 0); return @out; } - var r = NDArray.Scalar(sum_elementwise(arr, typeCode)); + var r = NDArray.Scalar(sum_elementwise_il(arr, typeCode)); if (keepdims) { // NumPy: keepdims preserves the number of dimensions, all set to 1 diff --git a/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.ArgMax.cs b/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.ArgMax.cs index 7d76121b..12815ca7 100644 --- a/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.ArgMax.cs +++ b/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.ArgMax.cs @@ -19,7 +19,8 @@ public override NDArray ReduceArgMax(NDArray arr, int? axis_) return NDArray.Scalar(0); if (axis_ == null) - return NDArray.Scalar(argmax_elementwise(arr)); + // Use IL-generated kernels for element-wise reduction + return NDArray.Scalar(argmax_elementwise_il(arr)); var axis = axis_.Value; while (axis < 0) diff --git a/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.ArgMin.cs b/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.ArgMin.cs index 2749a7f0..6d73fc7e 100644 --- a/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.ArgMin.cs +++ b/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.ArgMin.cs @@ -19,7 +19,8 @@ public override NDArray ReduceArgMin(NDArray arr, int? axis_) return NDArray.Scalar(0); if (axis_ == null) - return NDArray.Scalar(argmin_elementwise(arr)); + // Use IL-generated kernels for element-wise reduction + return NDArray.Scalar(argmin_elementwise_il(arr)); var axis = axis_.Value; while (axis < 0) diff --git a/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.Mean.cs b/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.Mean.cs index 38f26b00..0b303b1d 100644 --- a/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.Mean.cs +++ b/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.Mean.cs @@ -31,7 +31,8 @@ public override NDArray ReduceMean(in NDArray arr, int? axis_, bool keepdims = f if (axis_ == null) { - var r = NDArray.Scalar(mean_elementwise(arr, typeCode)); + // Use IL-generated kernels for element-wise reduction + var r = NDArray.Scalar(mean_elementwise_il(arr, typeCode)); if (keepdims) { // NumPy: keepdims preserves the number of dimensions, all set to 1 diff --git a/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.Product.cs b/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.Product.cs index 77d6065a..aa18f177 100644 --- a/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.Product.cs +++ b/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.Product.cs @@ -32,7 +32,8 @@ public override NDArray ReduceProduct(NDArray arr, int? axis_, bool keepdims = f if (axis_ == null) { - var r = NDArray.Scalar(product_elementwise(arr, typeCode)); + // Use IL-generated kernels for element-wise reduction + var r = NDArray.Scalar(prod_elementwise_il(arr, typeCode)); if (keepdims) { // NumPy: keepdims preserves the number of dimensions, all set to 1 diff --git a/src/NumSharp.Core/Backends/Default/Math/Subtract/Default.Subtract.Boolean.cs b/src/NumSharp.Core/Backends/Default/Math/Subtract/Default.Subtract.Boolean.cs deleted file mode 100644 index 9bf03885..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Subtract/Default.Subtract.Boolean.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray SubtractBoolean(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of bool - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Subtract" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((bool*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("bool"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((bool*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToByte(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToByte(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToByte(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToByte(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToByte(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToByte(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToByte(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToByte(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt16(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt16(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt16(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt16(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToInt16(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt16(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToInt16(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToInt16(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt16(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt16(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt16(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt16(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToUInt16(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt16(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToUInt16(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToUInt16(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt32(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt32(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt32(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt32(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToInt32(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt32(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToInt32(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToInt32(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt32(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt32(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt32(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt32(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToUInt32(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt32(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToUInt32(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToUInt32(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt64(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt64(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt64(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt64(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToInt64(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToInt64(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToInt64(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToInt64(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt64(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt64(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt64(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt64(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToUInt64(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToUInt64(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToUInt64(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToUInt64(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToChar(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToChar(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToChar(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToChar(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToChar(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToChar(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToChar(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToChar(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDouble(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDouble(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDouble(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDouble(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToDouble(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDouble(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToDouble(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToDouble(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToSingle(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToSingle(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToSingle(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToSingle(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToSingle(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToSingle(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToSingle(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToSingle(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDecimal(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDecimal(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDecimal(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDecimal(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToDecimal(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToDecimal(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToDecimal(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToDecimal(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((bool*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((bool*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((bool*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((bool*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((bool*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((bool*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((bool*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((bool*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((bool*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((bool*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((bool*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Subtract/Default.Subtract.Byte.cs b/src/NumSharp.Core/Backends/Default/Math/Subtract/Default.Subtract.Byte.cs deleted file mode 100644 index bf2b9dab..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Subtract/Default.Subtract.Byte.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray SubtractByte(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of byte - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Subtract" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((byte*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("byte"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((byte*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((byte*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((byte*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((byte*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((byte*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((byte*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((byte*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((byte*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((byte*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((byte*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((byte*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((byte*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Subtract/Default.Subtract.Char.cs b/src/NumSharp.Core/Backends/Default/Math/Subtract/Default.Subtract.Char.cs deleted file mode 100644 index d0e8dcce..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Subtract/Default.Subtract.Char.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray SubtractChar(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of char - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Subtract" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((char*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("char"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((char*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((char*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((char*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((char*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((char*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((char*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((char*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((char*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((char*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((char*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((char*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((char*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Subtract/Default.Subtract.Decimal.cs b/src/NumSharp.Core/Backends/Default/Math/Subtract/Default.Subtract.Decimal.cs deleted file mode 100644 index 70069735..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Subtract/Default.Subtract.Decimal.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray SubtractDecimal(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of decimal - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Subtract" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((decimal*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("decimal"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((decimal*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((decimal*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((decimal*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((decimal*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((decimal*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((decimal*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((decimal*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((decimal*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((decimal*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((decimal*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((decimal*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((decimal*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Subtract/Default.Subtract.Double.cs b/src/NumSharp.Core/Backends/Default/Math/Subtract/Default.Subtract.Double.cs deleted file mode 100644 index e16a2b19..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Subtract/Default.Subtract.Double.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray SubtractDouble(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of double - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Subtract" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((double*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("double"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((double*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((double*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((double*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((double*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((double*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((double*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((double*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((double*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((double*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((double*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((double*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((double*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Subtract/Default.Subtract.Int16.cs b/src/NumSharp.Core/Backends/Default/Math/Subtract/Default.Subtract.Int16.cs deleted file mode 100644 index f36d68bb..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Subtract/Default.Subtract.Int16.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray SubtractInt16(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of short - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Subtract" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((short*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("short"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((short*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((short*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((short*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((short*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((short*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((short*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((short*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((short*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((short*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((short*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((short*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((short*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Subtract/Default.Subtract.Int32.cs b/src/NumSharp.Core/Backends/Default/Math/Subtract/Default.Subtract.Int32.cs deleted file mode 100644 index b0dc307d..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Subtract/Default.Subtract.Int32.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray SubtractInt32(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of int - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Subtract" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((int*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("int"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((int*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((int*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((int*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((int*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((int*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((int*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((int*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((int*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((int*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((int*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((int*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((int*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Subtract/Default.Subtract.Int64.cs b/src/NumSharp.Core/Backends/Default/Math/Subtract/Default.Subtract.Int64.cs deleted file mode 100644 index aab2823c..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Subtract/Default.Subtract.Int64.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray SubtractInt64(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of long - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Subtract" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((long*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("long"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((long*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((long*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((long*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((long*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((long*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((long*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((long*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((long*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((long*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((long*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((long*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((long*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Subtract/Default.Subtract.Single.cs b/src/NumSharp.Core/Backends/Default/Math/Subtract/Default.Subtract.Single.cs deleted file mode 100644 index ebe6eaea..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Subtract/Default.Subtract.Single.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray SubtractSingle(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of float - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Subtract" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((float*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("float"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((float*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((float*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((float*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((float*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((float*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((float*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((float*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((float*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((float*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((float*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((float*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((float*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Subtract/Default.Subtract.UInt16.cs b/src/NumSharp.Core/Backends/Default/Math/Subtract/Default.Subtract.UInt16.cs deleted file mode 100644 index 5c266bfe..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Subtract/Default.Subtract.UInt16.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray SubtractUInt16(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of ushort - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Subtract" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((ushort*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("ushort"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((ushort*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((ushort*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((ushort*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((ushort*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((ushort*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((ushort*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((ushort*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((ushort*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((ushort*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((ushort*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((ushort*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((ushort*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Subtract/Default.Subtract.UInt32.cs b/src/NumSharp.Core/Backends/Default/Math/Subtract/Default.Subtract.UInt32.cs deleted file mode 100644 index beba776b..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Subtract/Default.Subtract.UInt32.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray SubtractUInt32(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of uint - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Subtract" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((uint*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("uint"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((uint*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((uint*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((uint*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((uint*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((uint*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((uint*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((uint*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((uint*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((uint*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((uint*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((uint*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((uint*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Default/Math/Subtract/Default.Subtract.UInt64.cs b/src/NumSharp.Core/Backends/Default/Math/Subtract/Default.Subtract.UInt64.cs deleted file mode 100644 index a83addf2..00000000 --- a/src/NumSharp.Core/Backends/Default/Math/Subtract/Default.Subtract.UInt64.cs +++ /dev/null @@ -1,8417 +0,0 @@ -//Generated by Regex Templating Engine at 25/04/2021 17:12:59 UTC -//template source: K:\code\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Templates\Default.Op.General.template.cs - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using NumSharp.Backends.Unmanaged; -using NumSharp.Utilities; -using NumSharp.Utilities.Maths; - -namespace NumSharp.Backends -{ - //v2 - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray SubtractUInt64(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of ulong - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "Subtract" - %op_bool = "*" - %foreach supported_dtypes, supported_dtypes_lowercase% - case NPTypeCode.#1: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.#(op)(*((ulong*)lhs.Address), *((#2*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - %foreach supported_dtypes,supported_dtypes_lowercase% - |#normalcast = ("("+str("#102")+")") - |#caster = ( "#102"=="bool" | ("Converts.To" + str("#101")) | ("ulong"=="bool"|("#2"=="bool"|("Converts.To" + str("#101"))|normalcast)| normalcast) ) - case NPTypeCode.#101: { - var ret_address = (#102*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = #(caster)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = #(caster)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - % - default: - throw new NotSupportedException(); - } - } - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((ulong*)lhs.Address), *((bool*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Byte: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((ulong*)lhs.Address), *((byte*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((ulong*)lhs.Address), *((short*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt16: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((ulong*)lhs.Address), *((ushort*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((ulong*)lhs.Address), *((int*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt32: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((ulong*)lhs.Address), *((uint*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Int64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((ulong*)lhs.Address), *((long*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.UInt64: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((ulong*)lhs.Address), *((ulong*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Char: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((ulong*)lhs.Address), *((char*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Double: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((ulong*)lhs.Address), *((double*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Single: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((ulong*)lhs.Address), *((float*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - case NPTypeCode.Decimal: { - //if return type is scalar - var ret_type = np._FindCommonType(lhs, rhs); - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(Converts.ChangeType(Operator.Subtract(*((ulong*)lhs.Address), *((decimal*)rhs.Address)), ret_type)); - - (Shape leftshape, Shape rightshape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var retShape = leftshape.Clean(); - var ret = new NDArray(ret_type, retShape, false); - var leftLinear = leftshape.IsContiguous && !leftshape.IsBroadcasted; - var rightLinear = rightshape.IsContiguous && !rightshape.IsBroadcasted; - var len = ret.size; - switch (ret_type) { - case NPTypeCode.Boolean: { - var ret_address = (bool*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = Converts.ToBoolean(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = Converts.ToBoolean(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Byte: { - var ret_address = (byte*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (byte)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (byte)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int16: { - var ret_address = (short*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (short)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (short)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt16: { - var ret_address = (ushort*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ushort)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ushort)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int32: { - var ret_address = (int*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (int)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (int)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt32: { - var ret_address = (uint*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (uint)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (uint)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Int64: { - var ret_address = (long*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (long)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (long)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.UInt64: { - var ret_address = (ulong*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (ulong)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (ulong)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Char: { - var ret_address = (char*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (char)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (char)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Double: { - var ret_address = (double*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (double)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (double)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Single: { - var ret_address = (float*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (float)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (float)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - case NPTypeCode.Decimal: { - var ret_address = (decimal*) ret.Address; - - if (leftLinear && rightLinear) { - Debug.Assert(leftshape.size == len && rightshape.size == len); - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), (rhs_address[i]))); - } - - return ret; - } - - ValueCoordinatesIncrementor incr; - if (leftLinear) { // && !rightLinear - if (rightshape.IsBroadcasted && rightshape.IsScalarBroadcast) { - var rval = *rhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract((lhs_address[i]), rval)); - } else { - int leftOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftOffset++]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - } else if (rightLinear) { // !leftLinear && - if (leftshape.IsBroadcasted && leftshape.IsScalarBroadcast) { - var lval = *lhs_address; - for (int i = 0; i < len; i++) ret_address[i] = (decimal)(Operator.Subtract(lval, (rhs_address[i]))); - } else { - int rightOffset = 0; - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightOffset++]))); - } while (incr.Next() != null); - } - } else { - int retOffset = 0; - incr = new ValueCoordinatesIncrementor(ref retShape); - int[] current = incr.Index; - do { - ret_address[retOffset++] = (decimal)(Operator.Subtract((lhs_address[leftshape.GetOffset(current)]), (rhs_address[rightshape.GetOffset(current)]))); - } while (incr.Next() != null); - } - - return ret; - } - default: - throw new NotSupportedException(); - } - } - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Backends/Kernels/BinaryKernel.cs b/src/NumSharp.Core/Backends/Kernels/BinaryKernel.cs new file mode 100644 index 00000000..7355bbe1 --- /dev/null +++ b/src/NumSharp.Core/Backends/Kernels/BinaryKernel.cs @@ -0,0 +1,284 @@ +using System; + +namespace NumSharp.Backends.Kernels +{ + /// + /// Binary operation types supported by the SIMD kernel infrastructure. + /// + public enum BinaryOp + { + Add, + Subtract, + Multiply, + Divide, + Mod, + BitwiseAnd, + BitwiseOr, + BitwiseXor + } + + /// + /// Comparison operation types supported by the IL kernel infrastructure. + /// All comparison operations return bool (NPTypeCode.Boolean). + /// + public enum ComparisonOp + { + Equal, + NotEqual, + Less, + LessEqual, + Greater, + GreaterEqual + } + + /// + /// Unary operation types supported by the SIMD kernel infrastructure. + /// + public enum UnaryOp + { + // Core operations (Phase 1) + Negate, + Abs, + Sqrt, + Exp, + Log, + Sin, + Cos, + + // Extended operations (Phase 2 - future) + Tan, + Exp2, + Expm1, + Log2, + Log10, + Log1p, + Sinh, + Cosh, + Tanh, + ASin, + ACos, + ATan, + Sign, + Ceil, + Floor, + Round + } + + /// + /// Cache key for mixed-type binary operation kernels. + /// Identifies a unique kernel by LHS type, RHS type, result type, operation, and execution path. + /// + /// + /// Supports up to 3,600 unique kernels: 12 × 12 × 5 × 5 = 3,600 + /// (12 LHS types × 12 RHS types × 5 operations × 5 paths, result type determined by promotion rules) + /// + public readonly record struct MixedTypeKernelKey( + NPTypeCode LhsType, + NPTypeCode RhsType, + NPTypeCode ResultType, + BinaryOp Op, + ExecutionPath Path + ) + { + /// + /// Returns true if all three types are the same (no conversion needed). + /// + public bool IsSameType => LhsType == RhsType && RhsType == ResultType; + + /// + /// Returns true if the LHS needs conversion to result type. + /// + public bool NeedsLhsConversion => LhsType != ResultType; + + /// + /// Returns true if the RHS needs conversion to result type. + /// + public bool NeedsRhsConversion => RhsType != ResultType; + + public override string ToString() => $"{Op}_{LhsType}_{RhsType}_{ResultType}_{Path}"; + } + + /// + /// Execution paths for binary operations, selected based on stride analysis. + /// + public enum ExecutionPath + { + /// Both operands are fully C-contiguous with identical shapes. + SimdFull, + /// Right operand is a scalar (all strides = 0). + SimdScalarRight, + /// Left operand is a scalar (all strides = 0). + SimdScalarLeft, + /// Inner dimension is contiguous/broadcast for both operands. + SimdChunk, + /// Arbitrary strides, requires coordinate-based iteration. + General + } + + /// + /// Unified binary operation kernel signature. + /// All binary operations (Add, Sub, Mul, Div, Mod) use this interface. + /// The kernel handles pattern detection and dispatch internally. + /// + /// Element type (byte, short, int, long, float, double, etc.) + /// Pointer to left operand data + /// Pointer to right operand data + /// Pointer to output data + /// Left operand strides (element units, not bytes) + /// Right operand strides (element units, not bytes) + /// Output shape dimensions + /// Number of dimensions + /// Total number of output elements + public unsafe delegate void BinaryKernel( + T* lhs, + T* rhs, + T* result, + int* lhsStrides, + int* rhsStrides, + int* shape, + int ndim, + int totalSize + ) where T : unmanaged; + + /// + /// Mixed-type binary operation kernel signature using void pointers. + /// Handles operations where LHS, RHS, and result may have different types. + /// Type conversion is handled internally by the generated IL. + /// + /// Pointer to left operand data (typed as LhsType) + /// Pointer to right operand data (typed as RhsType) + /// Pointer to output data (typed as ResultType) + /// Left operand strides (element units) + /// Right operand strides (element units) + /// Output shape dimensions + /// Number of dimensions + /// Total number of output elements + public unsafe delegate void MixedTypeKernel( + void* lhs, + void* rhs, + void* result, + int* lhsStrides, + int* rhsStrides, + int* shape, + int ndim, + int totalSize + ); + + #region Unary Operations + + /// + /// Cache key for unary operation kernels. + /// Identifies a unique kernel by input type, output type, operation, and whether contiguous. + /// + public readonly record struct UnaryKernelKey( + NPTypeCode InputType, + NPTypeCode OutputType, + UnaryOp Op, + bool IsContiguous + ) + { + /// + /// Returns true if input and output types are the same (no conversion needed). + /// + public bool IsSameType => InputType == OutputType; + + public override string ToString() => $"{Op}_{InputType}_{OutputType}_{(IsContiguous ? "Contig" : "Strided")}"; + } + + /// + /// Unary operation kernel signature using void pointers. + /// Handles operations where input and output may have different types. + /// Type conversion is handled internally by the generated IL. + /// + /// Pointer to input data + /// Pointer to output data + /// Input strides (element units, not bytes) + /// Shape dimensions + /// Number of dimensions + /// Total number of elements + public unsafe delegate void UnaryKernel( + void* input, + void* output, + int* strides, + int* shape, + int ndim, + int totalSize + ); + + #endregion + + #region Comparison Operations + + /// + /// Cache key for comparison operation kernels. + /// Identifies a unique kernel by LHS type, RHS type, operation, and execution path. + /// Result type is always bool (NPTypeCode.Boolean). + /// + /// + /// Supports up to 4,320 unique kernels: 12 × 12 × 6 × 5 = 4,320 + /// (12 LHS types × 12 RHS types × 6 comparison ops × 5 paths) + /// + public readonly record struct ComparisonKernelKey( + NPTypeCode LhsType, + NPTypeCode RhsType, + ComparisonOp Op, + ExecutionPath Path + ) + { + /// + /// Returns true if both input types are the same (no conversion needed for comparison). + /// + public bool IsSameType => LhsType == RhsType; + + /// + /// Get the common type for comparison (promote both operands to this type). + /// + public NPTypeCode ComparisonType => GetComparisonType(LhsType, RhsType); + + /// + /// Result type is always bool for comparisons. + /// + public NPTypeCode ResultType => NPTypeCode.Boolean; + + public override string ToString() => $"{Op}_{LhsType}_{RhsType}_{Path}"; + + /// + /// Determine the common type to use for comparison between two types. + /// Both operands should be promoted to this type before comparison. + /// + private static NPTypeCode GetComparisonType(NPTypeCode lhs, NPTypeCode rhs) + { + if (lhs == rhs) return lhs; + + // Use the same type promotion rules as binary operations + // Prefer wider types and floating point over integer + return np._FindCommonScalarType(lhs, rhs); + } + } + + /// + /// Comparison operation kernel signature using void pointers. + /// LHS and RHS may have different types, but result is always bool. + /// Type conversion is handled internally by the generated IL. + /// + /// Pointer to left operand data + /// Pointer to right operand data + /// Pointer to output data (always bool*) + /// Left operand strides (element units) + /// Right operand strides (element units) + /// Output shape dimensions + /// Number of dimensions + /// Total number of output elements + public unsafe delegate void ComparisonKernel( + void* lhs, + void* rhs, + bool* result, + int* lhsStrides, + int* rhsStrides, + int* shape, + int ndim, + int totalSize + ); + + #endregion +} diff --git a/src/NumSharp.Core/Backends/Kernels/ILKernelGenerator.cs b/src/NumSharp.Core/Backends/Kernels/ILKernelGenerator.cs new file mode 100644 index 00000000..6d605c2d --- /dev/null +++ b/src/NumSharp.Core/Backends/Kernels/ILKernelGenerator.cs @@ -0,0 +1,4498 @@ +using System; +using System.Collections.Concurrent; +using System.Linq; +using System.Reflection; +using System.Reflection.Emit; +using System.Runtime.CompilerServices; +using System.Runtime.Intrinsics; + +namespace NumSharp.Backends.Kernels +{ + /// + /// Generates IL-based SIMD kernels using DynamicMethod. + /// These kernels provide ~10-15% speedup over the C# reference implementations + /// by allowing the JIT to inline Vector256 operations more aggressively. + /// + /// Currently implements the SimdFull execution path (both operands contiguous). + /// Falls back to C# implementations for other paths. + /// + public static class ILKernelGenerator + { + /// + /// Cache of IL-generated contiguous kernels. + /// Key: (Operation, Type) + /// + private static readonly ConcurrentDictionary<(BinaryOp, Type), Delegate> _contiguousKernelCache = new(); + + /// + /// Whether IL generation is enabled. Can be disabled for debugging. + /// + public static bool Enabled { get; set; } = true; + + /// + /// Number of IL-generated kernels in cache. + /// + public static int CachedCount => _contiguousKernelCache.Count; + + /// + /// Clear the IL kernel cache. + /// + public static void Clear() => _contiguousKernelCache.Clear(); + + #region Public API + + /// + /// Get or generate an IL-based kernel for contiguous (SimdFull) operations. + /// Returns null if IL generation is not supported for this type/operation. + /// + public static ContiguousKernel? GetContiguousKernel(BinaryOp op) where T : unmanaged + { + if (!Enabled) + return null; + + var key = (op, typeof(T)); + + // Check cache first + if (_contiguousKernelCache.TryGetValue(key, out var cached)) + return (ContiguousKernel)cached; + + // Generate new kernel + var kernel = TryGenerateContiguousKernel(op); + if (kernel == null) + return null; + + // Try to add to cache; if another thread added first, use theirs + if (_contiguousKernelCache.TryAdd(key, kernel)) + return kernel; + + // Another thread beat us - return the cached version + return (ContiguousKernel)_contiguousKernelCache[key]; + } + + /// + /// Generate a full unified kernel that handles all execution paths. + /// Uses IL-generated code for hot paths, falls back to C# for others. + /// + public static BinaryKernel? GenerateUnifiedKernel(BinaryOp op) where T : unmanaged + { + if (!Enabled) + return null; + + // Get the IL-generated contiguous kernel + var contiguousKernel = GetContiguousKernel(op); + if (contiguousKernel == null) + return null; + + // Create a wrapper that dispatches based on strides + return CreateDispatchingKernel(op, contiguousKernel); + } + + #endregion + + #region Contiguous Kernel Generation + + /// + /// Delegate for contiguous (SimdFull) operations. + /// Simplified signature - no strides needed since both arrays are contiguous. + /// + public unsafe delegate void ContiguousKernel(T* lhs, T* rhs, T* result, int count) where T : unmanaged; + + /// + /// Try to generate an IL-based contiguous kernel for the given operation and type. + /// + private static ContiguousKernel? TryGenerateContiguousKernel(BinaryOp op) where T : unmanaged + { + // Only support types with Vector256 support + if (!IsSimdSupported()) + return null; + + // Only support basic arithmetic operations + if (op != BinaryOp.Add && op != BinaryOp.Subtract && + op != BinaryOp.Multiply && op != BinaryOp.Divide) + return null; + + try + { + return GenerateContiguousKernelIL(op); + } + catch + { + // IL generation failed - fall back to C# + return null; + } + } + + /// + /// Generate IL for a contiguous SIMD kernel. + /// + private static unsafe ContiguousKernel GenerateContiguousKernelIL(BinaryOp op) where T : unmanaged + { + var dm = new DynamicMethod( + name: $"IL_Contiguous_{op}_{typeof(T).Name}", + returnType: typeof(void), + parameterTypes: new[] { typeof(T*), typeof(T*), typeof(T*), typeof(int) }, + owner: typeof(ILKernelGenerator), + skipVisibility: true + ); + + var il = dm.GetILGenerator(); + + // Declare locals + var locI = il.DeclareLocal(typeof(int)); // loop counter + var locVectorEnd = il.DeclareLocal(typeof(int)); // totalSize - vectorCount + + // Define labels + var lblSimdLoop = il.DefineLabel(); + var lblSimdLoopEnd = il.DefineLabel(); + var lblTailLoop = il.DefineLabel(); + var lblTailLoopEnd = il.DefineLabel(); + + int vectorCount = GetVectorCount(); + int elementSize = Unsafe.SizeOf(); + + // vectorEnd = count - vectorCount + il.Emit(OpCodes.Ldarg_3); // count + il.Emit(OpCodes.Ldc_I4, vectorCount); + il.Emit(OpCodes.Sub); + il.Emit(OpCodes.Stloc, locVectorEnd); + + // i = 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locI); + + // ========== SIMD LOOP ========== + il.MarkLabel(lblSimdLoop); + + // if (i > vectorEnd) goto SimdLoopEnd + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldloc, locVectorEnd); + il.Emit(OpCodes.Bgt, lblSimdLoopEnd); + + // Load lhs vector: Vector256.Load(lhs + i) + il.Emit(OpCodes.Ldarg_0); // lhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, elementSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitVectorLoad(il); + + // Load rhs vector: Vector256.Load(rhs + i) + il.Emit(OpCodes.Ldarg_1); // rhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, elementSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitVectorLoad(il); + + // Perform vector operation + EmitVectorOperation(il, op); + + // Store result: Vector256.Store(result, result + i) + il.Emit(OpCodes.Ldarg_2); // result + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, elementSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitVectorStore(il); + + // i += vectorCount + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4, vectorCount); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblSimdLoop); + il.MarkLabel(lblSimdLoopEnd); + + // ========== TAIL LOOP ========== + il.MarkLabel(lblTailLoop); + + // if (i >= count) goto TailLoopEnd + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldarg_3); // count + il.Emit(OpCodes.Bge, lblTailLoopEnd); + + // result[i] = lhs[i] op rhs[i] + // Address: result + i * elementSize + il.Emit(OpCodes.Ldarg_2); // result + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, elementSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + + // Load lhs[i] + il.Emit(OpCodes.Ldarg_0); // lhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, elementSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il); + + // Load rhs[i] + il.Emit(OpCodes.Ldarg_1); // rhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, elementSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il); + + // Perform scalar operation + EmitScalarOperation(il, op); + + // Store to result[i] + EmitStoreIndirect(il); + + // i++ + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblTailLoop); + il.MarkLabel(lblTailLoopEnd); + + il.Emit(OpCodes.Ret); + + return dm.CreateDelegate>(); + } + + #endregion + + #region Unified Kernel with Dispatch + + /// + /// Create a unified kernel that dispatches to IL-generated code for contiguous arrays. + /// + private static unsafe BinaryKernel CreateDispatchingKernel(BinaryOp op, ContiguousKernel contiguousKernel) + where T : unmanaged + { + // Get the C# fallback kernel method + var csharpKernel = GetCSharpKernel(op); + + return (T* lhs, T* rhs, T* result, int* lhsStrides, int* rhsStrides, int* shape, int ndim, int totalSize) => + { + var path = StrideDetector.Classify(lhsStrides, rhsStrides, shape, ndim); + + if (path == ExecutionPath.SimdFull) + { + // Use IL-generated kernel for contiguous arrays + contiguousKernel(lhs, rhs, result, totalSize); + } + else + { + // Fall back to C# implementation for other paths + csharpKernel(lhs, rhs, result, lhsStrides, rhsStrides, shape, ndim, totalSize); + } + }; + } + + /// + /// Get the C# reference implementation for fallback. + /// + private static unsafe BinaryKernel GetCSharpKernel(BinaryOp op) where T : unmanaged + { + // Return the appropriate C# kernel based on type and operation + if (op == BinaryOp.Add) + { + if (typeof(T) == typeof(int)) + return (BinaryKernel)(Delegate)(BinaryKernel)SimdKernels.Add_Int32; + if (typeof(T) == typeof(long)) + return (BinaryKernel)(Delegate)(BinaryKernel)SimdKernels.Add_Int64; + if (typeof(T) == typeof(float)) + return (BinaryKernel)(Delegate)(BinaryKernel)SimdKernels.Add_Single; + if (typeof(T) == typeof(double)) + return (BinaryKernel)(Delegate)(BinaryKernel)SimdKernels.Add_Double; + } + + throw new NotSupportedException($"C# kernel not available for {op} on {typeof(T).Name}"); + } + + #endregion + + #region IL Emission Helpers + + private static bool IsSimdSupported() where T : unmanaged + { + return typeof(T) == typeof(int) || + typeof(T) == typeof(long) || + typeof(T) == typeof(float) || + typeof(T) == typeof(double) || + typeof(T) == typeof(byte) || + typeof(T) == typeof(short) || + typeof(T) == typeof(uint) || + typeof(T) == typeof(ulong) || + typeof(T) == typeof(ushort); + } + + private static int GetVectorCount() where T : unmanaged + { + return Vector256.Count; + } + + private static void EmitVectorLoad(ILGenerator il) where T : unmanaged + { + // Call Vector256.Load(T*) + var loadMethod = typeof(Vector256).GetMethod( + nameof(Vector256.Load), + BindingFlags.Public | BindingFlags.Static, + null, + new[] { typeof(T).MakePointerType() }, + null + ); + + if (loadMethod == null) + { + // Try the generic version + loadMethod = typeof(Vector256) + .GetMethods(BindingFlags.Public | BindingFlags.Static) + .First(m => m.Name == "Load" && m.IsGenericMethod && m.GetParameters().Length == 1) + .MakeGenericMethod(typeof(T)); + } + + il.EmitCall(OpCodes.Call, loadMethod!, null); + } + + private static void EmitVectorStore(ILGenerator il) where T : unmanaged + { + // Stack has: [Vector256, T*] + // Need to call Vector256.Store(Vector256 source, T* destination) + // But Store takes (this Vector256, T*) so we need the extension method + + var storeMethod = typeof(Vector256).GetMethods(BindingFlags.Public | BindingFlags.Static) + .Where(m => m.Name == "Store" && m.IsGenericMethod) + .Select(m => m.MakeGenericMethod(typeof(T))) + .FirstOrDefault(m => + { + var p = m.GetParameters(); + return p.Length == 2 && + p[0].ParameterType == typeof(Vector256) && + p[1].ParameterType == typeof(T).MakePointerType(); + }); + + if (storeMethod == null) + throw new InvalidOperationException($"Could not find Vector256.Store<{typeof(T).Name}> method"); + + il.EmitCall(OpCodes.Call, storeMethod, null); + } + + private static void EmitVectorOperation(ILGenerator il, BinaryOp op) where T : unmanaged + { + // Stack has two Vector256 values, need to emit the operation + string methodName = op switch + { + BinaryOp.Add => "op_Addition", + BinaryOp.Subtract => "op_Subtraction", + BinaryOp.Multiply => "op_Multiply", + BinaryOp.Divide => "op_Division", + _ => throw new NotSupportedException($"Operation {op} not supported for SIMD") + }; + + // Look for the operator on Vector256 + var vectorType = typeof(Vector256); + var opMethod = vectorType.GetMethod( + methodName, + BindingFlags.Public | BindingFlags.Static, + null, + new[] { vectorType, vectorType }, + null + ); + + if (opMethod == null) + throw new InvalidOperationException($"Could not find {methodName} for Vector256<{typeof(T).Name}>"); + + il.EmitCall(OpCodes.Call, opMethod, null); + } + + private static void EmitScalarOperation(ILGenerator il, BinaryOp op) where T : unmanaged + { + // For scalar operations, use IL opcodes + // Stack has two T values + var opcode = op switch + { + BinaryOp.Add => OpCodes.Add, + BinaryOp.Subtract => OpCodes.Sub, + BinaryOp.Multiply => OpCodes.Mul, + BinaryOp.Divide => GetDivOpcode(), + _ => throw new NotSupportedException($"Operation {op} not supported") + }; + + il.Emit(opcode); + } + + private static OpCode GetDivOpcode() where T : unmanaged + { + // Use Div_Un for unsigned types + if (typeof(T) == typeof(byte) || typeof(T) == typeof(ushort) || + typeof(T) == typeof(uint) || typeof(T) == typeof(ulong)) + { + return OpCodes.Div_Un; + } + return OpCodes.Div; + } + + private static void EmitLoadIndirect(ILGenerator il) where T : unmanaged + { + // Emit the appropriate ldind instruction based on type + if (typeof(T) == typeof(byte)) il.Emit(OpCodes.Ldind_U1); + else if (typeof(T) == typeof(sbyte)) il.Emit(OpCodes.Ldind_I1); + else if (typeof(T) == typeof(short)) il.Emit(OpCodes.Ldind_I2); + else if (typeof(T) == typeof(ushort)) il.Emit(OpCodes.Ldind_U2); + else if (typeof(T) == typeof(int)) il.Emit(OpCodes.Ldind_I4); + else if (typeof(T) == typeof(uint)) il.Emit(OpCodes.Ldind_U4); + else if (typeof(T) == typeof(long)) il.Emit(OpCodes.Ldind_I8); + else if (typeof(T) == typeof(ulong)) il.Emit(OpCodes.Ldind_I8); // Same as long + else if (typeof(T) == typeof(float)) il.Emit(OpCodes.Ldind_R4); + else if (typeof(T) == typeof(double)) il.Emit(OpCodes.Ldind_R8); + else throw new NotSupportedException($"Type {typeof(T)} not supported for ldind"); + } + + private static void EmitStoreIndirect(ILGenerator il) where T : unmanaged + { + // Emit the appropriate stind instruction based on type + if (typeof(T) == typeof(byte) || typeof(T) == typeof(sbyte)) il.Emit(OpCodes.Stind_I1); + else if (typeof(T) == typeof(short) || typeof(T) == typeof(ushort)) il.Emit(OpCodes.Stind_I2); + else if (typeof(T) == typeof(int) || typeof(T) == typeof(uint)) il.Emit(OpCodes.Stind_I4); + else if (typeof(T) == typeof(long) || typeof(T) == typeof(ulong)) il.Emit(OpCodes.Stind_I8); + else if (typeof(T) == typeof(float)) il.Emit(OpCodes.Stind_R4); + else if (typeof(T) == typeof(double)) il.Emit(OpCodes.Stind_R8); + else throw new NotSupportedException($"Type {typeof(T)} not supported for stind"); + } + + #endregion + + #region Mixed-Type Kernel Generation + + /// + /// Cache for mixed-type kernels. + /// Key: MixedTypeKernelKey (LhsType, RhsType, ResultType, Op, Path) + /// + private static readonly ConcurrentDictionary _mixedTypeCache = new(); + + /// + /// Number of mixed-type kernels in cache. + /// + public static int MixedTypeCachedCount => _mixedTypeCache.Count; + + /// + /// Clear both kernel caches. + /// + public static void ClearAll() + { + _contiguousKernelCache.Clear(); + _mixedTypeCache.Clear(); + } + + /// + /// Get or generate a mixed-type kernel for the specified key. + /// + public static MixedTypeKernel GetMixedTypeKernel(MixedTypeKernelKey key) + { + if (!Enabled) + throw new InvalidOperationException("IL generation is disabled"); + + return _mixedTypeCache.GetOrAdd(key, GenerateMixedTypeKernel); + } + + /// + /// Try to get or generate a mixed-type kernel. Returns null if generation fails. + /// + public static MixedTypeKernel? TryGetMixedTypeKernel(MixedTypeKernelKey key) + { + if (!Enabled) + return null; + + try + { + return _mixedTypeCache.GetOrAdd(key, GenerateMixedTypeKernel); + } + catch + { + return null; + } + } + + /// + /// Generate a mixed-type kernel for the specified key. + /// + private static MixedTypeKernel GenerateMixedTypeKernel(MixedTypeKernelKey key) + { + return key.Path switch + { + ExecutionPath.SimdFull => GenerateSimdFullKernel(key), + ExecutionPath.SimdScalarRight => GenerateSimdScalarRightKernel(key), + ExecutionPath.SimdScalarLeft => GenerateSimdScalarLeftKernel(key), + ExecutionPath.SimdChunk => GenerateSimdChunkKernel(key), + ExecutionPath.General => GenerateGeneralKernel(key), + _ => throw new NotSupportedException($"Path {key.Path} not supported") + }; + } + + #endregion + + #region Path-Specific Kernel Generation + + /// + /// Generate a SimdFull kernel for contiguous arrays (both operands contiguous). + /// Uses Vector256 SIMD for supported types and operations, scalar loop otherwise. + /// + private static MixedTypeKernel GenerateSimdFullKernel(MixedTypeKernelKey key) + { + // MixedTypeKernel signature: + // void(void* lhs, void* rhs, void* result, int* lhsStrides, int* rhsStrides, int* shape, int ndim, int totalSize) + var dm = new DynamicMethod( + name: $"MixedType_SimdFull_{key}", + returnType: typeof(void), + parameterTypes: new[] + { + typeof(void*), typeof(void*), typeof(void*), + typeof(int*), typeof(int*), typeof(int*), + typeof(int), typeof(int) + }, + owner: typeof(ILKernelGenerator), + skipVisibility: true + ); + + var il = dm.GetILGenerator(); + + int lhsSize = GetTypeSize(key.LhsType); + int rhsSize = GetTypeSize(key.RhsType); + int resultSize = GetTypeSize(key.ResultType); + + // Can only use SIMD for same-type, supported types, and supported operations + // Mod doesn't have SIMD support (no Vector256 modulo operator) + bool canSimd = CanUseSimd(key.ResultType) && key.IsSameType && CanUseSimdForOp(key.Op); + + if (canSimd) + { + EmitSimdFullLoop(il, key, lhsSize, rhsSize, resultSize); + } + else + { + EmitScalarFullLoop(il, key, lhsSize, rhsSize, resultSize); + } + + il.Emit(OpCodes.Ret); + return dm.CreateDelegate(); + } + + /// + /// Check if operation has SIMD support via Vector256. + /// + private static bool CanUseSimdForOp(BinaryOp op) + { + // Only Add, Subtract, Multiply, Divide have Vector256 operators + // Mod requires scalar implementation + return op == BinaryOp.Add || op == BinaryOp.Subtract || + op == BinaryOp.Multiply || op == BinaryOp.Divide; + } + + /// + /// Generate a SimdScalarRight kernel (right operand is scalar). + /// + private static MixedTypeKernel GenerateSimdScalarRightKernel(MixedTypeKernelKey key) + { + var dm = new DynamicMethod( + name: $"MixedType_SimdScalarRight_{key}", + returnType: typeof(void), + parameterTypes: new[] + { + typeof(void*), typeof(void*), typeof(void*), + typeof(int*), typeof(int*), typeof(int*), + typeof(int), typeof(int) + }, + owner: typeof(ILKernelGenerator), + skipVisibility: true + ); + + var il = dm.GetILGenerator(); + + int lhsSize = GetTypeSize(key.LhsType); + int rhsSize = GetTypeSize(key.RhsType); + int resultSize = GetTypeSize(key.ResultType); + + EmitScalarRightLoop(il, key, lhsSize, rhsSize, resultSize); + + il.Emit(OpCodes.Ret); + return dm.CreateDelegate(); + } + + /// + /// Generate a SimdScalarLeft kernel (left operand is scalar). + /// + private static MixedTypeKernel GenerateSimdScalarLeftKernel(MixedTypeKernelKey key) + { + var dm = new DynamicMethod( + name: $"MixedType_SimdScalarLeft_{key}", + returnType: typeof(void), + parameterTypes: new[] + { + typeof(void*), typeof(void*), typeof(void*), + typeof(int*), typeof(int*), typeof(int*), + typeof(int), typeof(int) + }, + owner: typeof(ILKernelGenerator), + skipVisibility: true + ); + + var il = dm.GetILGenerator(); + + int lhsSize = GetTypeSize(key.LhsType); + int rhsSize = GetTypeSize(key.RhsType); + int resultSize = GetTypeSize(key.ResultType); + + EmitScalarLeftLoop(il, key, lhsSize, rhsSize, resultSize); + + il.Emit(OpCodes.Ret); + return dm.CreateDelegate(); + } + + /// + /// Generate a SimdChunk kernel (inner dimension contiguous/broadcast). + /// + private static MixedTypeKernel GenerateSimdChunkKernel(MixedTypeKernelKey key) + { + var dm = new DynamicMethod( + name: $"MixedType_SimdChunk_{key}", + returnType: typeof(void), + parameterTypes: new[] + { + typeof(void*), typeof(void*), typeof(void*), + typeof(int*), typeof(int*), typeof(int*), + typeof(int), typeof(int) + }, + owner: typeof(ILKernelGenerator), + skipVisibility: true + ); + + var il = dm.GetILGenerator(); + + int lhsSize = GetTypeSize(key.LhsType); + int rhsSize = GetTypeSize(key.RhsType); + int resultSize = GetTypeSize(key.ResultType); + + EmitChunkLoop(il, key, lhsSize, rhsSize, resultSize); + + il.Emit(OpCodes.Ret); + return dm.CreateDelegate(); + } + + /// + /// Generate a General kernel (arbitrary strides, coordinate-based iteration). + /// + private static MixedTypeKernel GenerateGeneralKernel(MixedTypeKernelKey key) + { + var dm = new DynamicMethod( + name: $"MixedType_General_{key}", + returnType: typeof(void), + parameterTypes: new[] + { + typeof(void*), typeof(void*), typeof(void*), + typeof(int*), typeof(int*), typeof(int*), + typeof(int), typeof(int) + }, + owner: typeof(ILKernelGenerator), + skipVisibility: true + ); + + var il = dm.GetILGenerator(); + + int lhsSize = GetTypeSize(key.LhsType); + int rhsSize = GetTypeSize(key.RhsType); + int resultSize = GetTypeSize(key.ResultType); + + EmitGeneralLoop(il, key, lhsSize, rhsSize, resultSize); + + il.Emit(OpCodes.Ret); + return dm.CreateDelegate(); + } + + #endregion + + #region IL Loop Emission + + /// + /// Emit a scalar loop for contiguous arrays (no SIMD). + /// + private static void EmitScalarFullLoop(ILGenerator il, MixedTypeKernelKey key, + int lhsSize, int rhsSize, int resultSize) + { + // Args: void* lhs (0), void* rhs (1), void* result (2), + // int* lhsStrides (3), int* rhsStrides (4), int* shape (5), + // int ndim (6), int totalSize (7) + + var locI = il.DeclareLocal(typeof(int)); // loop counter + + var lblLoop = il.DefineLabel(); + var lblLoopEnd = il.DefineLabel(); + + // i = 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locI); + + il.MarkLabel(lblLoop); + + // if (i >= totalSize) goto end + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize + il.Emit(OpCodes.Bge, lblLoopEnd); + + // result[i] = op(lhs[i], rhs[i]) + // Load result address + il.Emit(OpCodes.Ldarg_2); // result + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, resultSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + + // Load lhs[i] and convert to result type + il.Emit(OpCodes.Ldarg_0); // lhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, lhsSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.LhsType); + EmitConvertTo(il, key.LhsType, key.ResultType); + + // Load rhs[i] and convert to result type + il.Emit(OpCodes.Ldarg_1); // rhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, rhsSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.RhsType); + EmitConvertTo(il, key.RhsType, key.ResultType); + + // Perform operation + EmitScalarOperation(il, key.Op, key.ResultType); + + // Store result + EmitStoreIndirect(il, key.ResultType); + + // i++ + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblLoop); + il.MarkLabel(lblLoopEnd); + } + + /// + /// Emit a SIMD loop for contiguous same-type arrays. + /// + private static void EmitSimdFullLoop(ILGenerator il, MixedTypeKernelKey key, + int lhsSize, int rhsSize, int resultSize) + { + // For same-type operations, use Vector256 + int vectorCount = GetVectorCount(key.ResultType); + + var locI = il.DeclareLocal(typeof(int)); // loop counter + var locVectorEnd = il.DeclareLocal(typeof(int)); // totalSize - vectorCount + + var lblSimdLoop = il.DefineLabel(); + var lblSimdLoopEnd = il.DefineLabel(); + var lblTailLoop = il.DefineLabel(); + var lblTailLoopEnd = il.DefineLabel(); + + // vectorEnd = totalSize - vectorCount + il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize + il.Emit(OpCodes.Ldc_I4, vectorCount); + il.Emit(OpCodes.Sub); + il.Emit(OpCodes.Stloc, locVectorEnd); + + // i = 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locI); + + // === SIMD LOOP === + il.MarkLabel(lblSimdLoop); + + // if (i > vectorEnd) goto SimdLoopEnd + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldloc, locVectorEnd); + il.Emit(OpCodes.Bgt, lblSimdLoopEnd); + + // Load lhs vector + il.Emit(OpCodes.Ldarg_0); // lhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, lhsSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitVectorLoad(il, key.LhsType); + + // Load rhs vector + il.Emit(OpCodes.Ldarg_1); // rhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, rhsSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitVectorLoad(il, key.RhsType); + + // Vector operation + EmitVectorOperation(il, key.Op, key.ResultType); + + // Store result vector + il.Emit(OpCodes.Ldarg_2); // result + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, resultSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitVectorStore(il, key.ResultType); + + // i += vectorCount + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4, vectorCount); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblSimdLoop); + il.MarkLabel(lblSimdLoopEnd); + + // === TAIL LOOP === + il.MarkLabel(lblTailLoop); + + // if (i >= totalSize) goto end + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize + il.Emit(OpCodes.Bge, lblTailLoopEnd); + + // result[i] = op(lhs[i], rhs[i]) + il.Emit(OpCodes.Ldarg_2); // result + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, resultSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + + il.Emit(OpCodes.Ldarg_0); // lhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, lhsSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.LhsType); + + il.Emit(OpCodes.Ldarg_1); // rhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, rhsSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.RhsType); + + EmitScalarOperation(il, key.Op, key.ResultType); + EmitStoreIndirect(il, key.ResultType); + + // i++ + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblTailLoop); + il.MarkLabel(lblTailLoopEnd); + } + + /// + /// Emit loop for scalar right operand (broadcast scalar to array). + /// + private static void EmitScalarRightLoop(ILGenerator il, MixedTypeKernelKey key, + int lhsSize, int rhsSize, int resultSize) + { + var locI = il.DeclareLocal(typeof(int)); // loop counter + var locRhsVal = il.DeclareLocal(GetClrType(key.ResultType)); // scalar value + + var lblLoop = il.DefineLabel(); + var lblLoopEnd = il.DefineLabel(); + + // Load rhs[0] and convert to result type, store in local + il.Emit(OpCodes.Ldarg_1); // rhs + EmitLoadIndirect(il, key.RhsType); + EmitConvertTo(il, key.RhsType, key.ResultType); + il.Emit(OpCodes.Stloc, locRhsVal); + + // i = 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locI); + + il.MarkLabel(lblLoop); + + // if (i >= totalSize) goto end + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize + il.Emit(OpCodes.Bge, lblLoopEnd); + + // result[i] = op(lhs[i], rhsVal) + il.Emit(OpCodes.Ldarg_2); // result + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, resultSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + + // Load lhs[i] and convert + il.Emit(OpCodes.Ldarg_0); // lhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, lhsSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.LhsType); + EmitConvertTo(il, key.LhsType, key.ResultType); + + // Load cached rhs scalar + il.Emit(OpCodes.Ldloc, locRhsVal); + + EmitScalarOperation(il, key.Op, key.ResultType); + EmitStoreIndirect(il, key.ResultType); + + // i++ + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblLoop); + il.MarkLabel(lblLoopEnd); + } + + /// + /// Emit loop for scalar left operand (broadcast scalar to array). + /// + private static void EmitScalarLeftLoop(ILGenerator il, MixedTypeKernelKey key, + int lhsSize, int rhsSize, int resultSize) + { + var locI = il.DeclareLocal(typeof(int)); // loop counter + var locLhsVal = il.DeclareLocal(GetClrType(key.ResultType)); // scalar value + + var lblLoop = il.DefineLabel(); + var lblLoopEnd = il.DefineLabel(); + + // Load lhs[0] and convert to result type, store in local + il.Emit(OpCodes.Ldarg_0); // lhs + EmitLoadIndirect(il, key.LhsType); + EmitConvertTo(il, key.LhsType, key.ResultType); + il.Emit(OpCodes.Stloc, locLhsVal); + + // i = 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locI); + + il.MarkLabel(lblLoop); + + // if (i >= totalSize) goto end + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize + il.Emit(OpCodes.Bge, lblLoopEnd); + + // result[i] = op(lhsVal, rhs[i]) + il.Emit(OpCodes.Ldarg_2); // result + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, resultSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + + // Load cached lhs scalar + il.Emit(OpCodes.Ldloc, locLhsVal); + + // Load rhs[i] and convert + il.Emit(OpCodes.Ldarg_1); // rhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, rhsSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.RhsType); + EmitConvertTo(il, key.RhsType, key.ResultType); + + EmitScalarOperation(il, key.Op, key.ResultType); + EmitStoreIndirect(il, key.ResultType); + + // i++ + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblLoop); + il.MarkLabel(lblLoopEnd); + } + + /// + /// Emit chunked loop for inner-contiguous arrays. + /// This is more complex - processes the inner dimension as a chunk. + /// + private static void EmitChunkLoop(ILGenerator il, MixedTypeKernelKey key, + int lhsSize, int rhsSize, int resultSize) + { + // For simplicity in initial implementation, use general loop + // TODO: Implement proper chunked SIMD processing + EmitGeneralLoop(il, key, lhsSize, rhsSize, resultSize); + } + + /// + /// Emit general coordinate-based iteration loop. + /// Handles arbitrary strides. + /// + private static void EmitGeneralLoop(ILGenerator il, MixedTypeKernelKey key, + int lhsSize, int rhsSize, int resultSize) + { + // Args: void* lhs (0), void* rhs (1), void* result (2), + // int* lhsStrides (3), int* rhsStrides (4), int* shape (5), + // int ndim (6), int totalSize (7) + + var locI = il.DeclareLocal(typeof(int)); // linear index + var locD = il.DeclareLocal(typeof(int)); // dimension counter + var locLhsOffset = il.DeclareLocal(typeof(int)); // lhs offset + var locRhsOffset = il.DeclareLocal(typeof(int)); // rhs offset + var locCoord = il.DeclareLocal(typeof(int)); // current coordinate + var locIdx = il.DeclareLocal(typeof(int)); // temp for coordinate calculation + + var lblLoop = il.DefineLabel(); + var lblLoopEnd = il.DefineLabel(); + var lblDimLoop = il.DefineLabel(); + var lblDimLoopEnd = il.DefineLabel(); + + // i = 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locI); + + // Main loop + il.MarkLabel(lblLoop); + + // if (i >= totalSize) goto end + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize + il.Emit(OpCodes.Bge, lblLoopEnd); + + // Calculate lhsOffset and rhsOffset from linear index + // lhsOffset = 0, rhsOffset = 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locLhsOffset); + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locRhsOffset); + + // idx = i (for coordinate calculation) + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Stloc, locIdx); + + // For each dimension (right to left): coord = idx % shape[d], idx /= shape[d] + // d = ndim - 1 + il.Emit(OpCodes.Ldarg_S, (byte)6); // ndim + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Sub); + il.Emit(OpCodes.Stloc, locD); + + il.MarkLabel(lblDimLoop); + + // if (d < 0) goto DimLoopEnd + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Blt, lblDimLoopEnd); + + // coord = idx % shape[d] + il.Emit(OpCodes.Ldloc, locIdx); + il.Emit(OpCodes.Ldarg_S, (byte)5); // shape + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4_4); // sizeof(int) + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Ldind_I4); + il.Emit(OpCodes.Rem); + il.Emit(OpCodes.Stloc, locCoord); + + // idx /= shape[d] + il.Emit(OpCodes.Ldloc, locIdx); + il.Emit(OpCodes.Ldarg_S, (byte)5); // shape + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4_4); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Ldind_I4); + il.Emit(OpCodes.Div); + il.Emit(OpCodes.Stloc, locIdx); + + // lhsOffset += coord * lhsStrides[d] + il.Emit(OpCodes.Ldloc, locLhsOffset); + il.Emit(OpCodes.Ldloc, locCoord); + il.Emit(OpCodes.Ldarg_3); // lhsStrides + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4_4); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Ldind_I4); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locLhsOffset); + + // rhsOffset += coord * rhsStrides[d] + il.Emit(OpCodes.Ldloc, locRhsOffset); + il.Emit(OpCodes.Ldloc, locCoord); + il.Emit(OpCodes.Ldarg_S, (byte)4); // rhsStrides + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4_4); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Ldind_I4); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locRhsOffset); + + // d-- + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Sub); + il.Emit(OpCodes.Stloc, locD); + + il.Emit(OpCodes.Br, lblDimLoop); + il.MarkLabel(lblDimLoopEnd); + + // Now compute: result[i] = op(lhs[lhsOffset], rhs[rhsOffset]) + // Load result address (contiguous output) + il.Emit(OpCodes.Ldarg_2); // result + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, resultSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + + // Load lhs[lhsOffset] + il.Emit(OpCodes.Ldarg_0); // lhs + il.Emit(OpCodes.Ldloc, locLhsOffset); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, lhsSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.LhsType); + EmitConvertTo(il, key.LhsType, key.ResultType); + + // Load rhs[rhsOffset] + il.Emit(OpCodes.Ldarg_1); // rhs + il.Emit(OpCodes.Ldloc, locRhsOffset); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, rhsSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.RhsType); + EmitConvertTo(il, key.RhsType, key.ResultType); + + // Operation + EmitScalarOperation(il, key.Op, key.ResultType); + + // Store + EmitStoreIndirect(il, key.ResultType); + + // i++ + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblLoop); + il.MarkLabel(lblLoopEnd); + } + + #endregion + + #region NPTypeCode-Based IL Helpers + + /// + /// Get size in bytes for NPTypeCode. + /// + internal static int GetTypeSize(NPTypeCode type) + { + return type switch + { + NPTypeCode.Boolean => 1, + NPTypeCode.Byte => 1, + NPTypeCode.Int16 => 2, + NPTypeCode.UInt16 => 2, + NPTypeCode.Int32 => 4, + NPTypeCode.UInt32 => 4, + NPTypeCode.Int64 => 8, + NPTypeCode.UInt64 => 8, + NPTypeCode.Char => 2, + NPTypeCode.Single => 4, + NPTypeCode.Double => 8, + NPTypeCode.Decimal => 16, + _ => throw new NotSupportedException($"Type {type} not supported") + }; + } + + /// + /// Get CLR Type for NPTypeCode. + /// + internal static Type GetClrType(NPTypeCode type) + { + return type switch + { + NPTypeCode.Boolean => typeof(bool), + NPTypeCode.Byte => typeof(byte), + NPTypeCode.Int16 => typeof(short), + NPTypeCode.UInt16 => typeof(ushort), + NPTypeCode.Int32 => typeof(int), + NPTypeCode.UInt32 => typeof(uint), + NPTypeCode.Int64 => typeof(long), + NPTypeCode.UInt64 => typeof(ulong), + NPTypeCode.Char => typeof(char), + NPTypeCode.Single => typeof(float), + NPTypeCode.Double => typeof(double), + NPTypeCode.Decimal => typeof(decimal), + _ => throw new NotSupportedException($"Type {type} not supported") + }; + } + + /// + /// Check if type supports SIMD Vector256 operations. + /// + internal static bool CanUseSimd(NPTypeCode type) + { + return type switch + { + NPTypeCode.Byte => true, + NPTypeCode.Int16 => true, + NPTypeCode.UInt16 => true, + NPTypeCode.Int32 => true, + NPTypeCode.UInt32 => true, + NPTypeCode.Int64 => true, + NPTypeCode.UInt64 => true, + NPTypeCode.Single => true, + NPTypeCode.Double => true, + _ => false // bool, char, decimal don't have Vector256 support + }; + } + + /// + /// Get Vector256 element count for type. + /// + internal static int GetVectorCount(NPTypeCode type) + { + return 32 / GetTypeSize(type); // Vector256 is 32 bytes + } + + /// + /// Emit load indirect for NPTypeCode. + /// + internal static void EmitLoadIndirect(ILGenerator il, NPTypeCode type) + { + switch (type) + { + case NPTypeCode.Boolean: + case NPTypeCode.Byte: + il.Emit(OpCodes.Ldind_U1); + break; + case NPTypeCode.Int16: + il.Emit(OpCodes.Ldind_I2); + break; + case NPTypeCode.UInt16: + case NPTypeCode.Char: + il.Emit(OpCodes.Ldind_U2); + break; + case NPTypeCode.Int32: + il.Emit(OpCodes.Ldind_I4); + break; + case NPTypeCode.UInt32: + il.Emit(OpCodes.Ldind_U4); + break; + case NPTypeCode.Int64: + case NPTypeCode.UInt64: + il.Emit(OpCodes.Ldind_I8); + break; + case NPTypeCode.Single: + il.Emit(OpCodes.Ldind_R4); + break; + case NPTypeCode.Double: + il.Emit(OpCodes.Ldind_R8); + break; + case NPTypeCode.Decimal: + il.Emit(OpCodes.Ldobj, typeof(decimal)); + break; + default: + throw new NotSupportedException($"Type {type} not supported for ldind"); + } + } + + /// + /// Emit store indirect for NPTypeCode. + /// + internal static void EmitStoreIndirect(ILGenerator il, NPTypeCode type) + { + switch (type) + { + case NPTypeCode.Boolean: + case NPTypeCode.Byte: + il.Emit(OpCodes.Stind_I1); + break; + case NPTypeCode.Int16: + case NPTypeCode.UInt16: + case NPTypeCode.Char: + il.Emit(OpCodes.Stind_I2); + break; + case NPTypeCode.Int32: + case NPTypeCode.UInt32: + il.Emit(OpCodes.Stind_I4); + break; + case NPTypeCode.Int64: + case NPTypeCode.UInt64: + il.Emit(OpCodes.Stind_I8); + break; + case NPTypeCode.Single: + il.Emit(OpCodes.Stind_R4); + break; + case NPTypeCode.Double: + il.Emit(OpCodes.Stind_R8); + break; + case NPTypeCode.Decimal: + il.Emit(OpCodes.Stobj, typeof(decimal)); + break; + default: + throw new NotSupportedException($"Type {type} not supported for stind"); + } + } + + /// + /// Emit type conversion from source to target type. + /// + internal static void EmitConvertTo(ILGenerator il, NPTypeCode from, NPTypeCode to) + { + if (from == to) + return; // No conversion needed + + // Special case: decimal conversions require method calls + if (from == NPTypeCode.Decimal || to == NPTypeCode.Decimal) + { + EmitDecimalConversion(il, from, to); + return; + } + + // For numeric types, use conv.* opcodes + switch (to) + { + case NPTypeCode.Boolean: + // Convert to bool: != 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Cgt_Un); + break; + case NPTypeCode.Byte: + il.Emit(OpCodes.Conv_U1); + break; + case NPTypeCode.Int16: + il.Emit(OpCodes.Conv_I2); + break; + case NPTypeCode.UInt16: + case NPTypeCode.Char: + il.Emit(OpCodes.Conv_U2); + break; + case NPTypeCode.Int32: + il.Emit(OpCodes.Conv_I4); + break; + case NPTypeCode.UInt32: + il.Emit(OpCodes.Conv_U4); + break; + case NPTypeCode.Int64: + if (IsUnsigned(from)) + il.Emit(OpCodes.Conv_U8); + else + il.Emit(OpCodes.Conv_I8); + break; + case NPTypeCode.UInt64: + il.Emit(OpCodes.Conv_U8); + break; + case NPTypeCode.Single: + if (IsUnsigned(from)) + il.Emit(OpCodes.Conv_R_Un); + il.Emit(OpCodes.Conv_R4); + break; + case NPTypeCode.Double: + if (IsUnsigned(from)) + il.Emit(OpCodes.Conv_R_Un); + il.Emit(OpCodes.Conv_R8); + break; + default: + throw new NotSupportedException($"Conversion to {to} not supported"); + } + } + + /// + /// Emit decimal-specific conversions. + /// + private static void EmitDecimalConversion(ILGenerator il, NPTypeCode from, NPTypeCode to) + { + if (to == NPTypeCode.Decimal) + { + // Convert to decimal - need to handle bool/char first + if (from == NPTypeCode.Boolean) + { + // bool -> int -> decimal + il.Emit(OpCodes.Conv_I4); + il.EmitCall(OpCodes.Call, typeof(decimal).GetMethod("op_Implicit", new[] { typeof(int) })!, null); + return; + } + if (from == NPTypeCode.Char) + { + // char -> int -> decimal + il.Emit(OpCodes.Conv_I4); + il.EmitCall(OpCodes.Call, typeof(decimal).GetMethod("op_Implicit", new[] { typeof(int) })!, null); + return; + } + + var method = from switch + { + NPTypeCode.Byte => typeof(decimal).GetMethod("op_Implicit", new[] { typeof(byte) }), + NPTypeCode.Int16 => typeof(decimal).GetMethod("op_Implicit", new[] { typeof(short) }), + NPTypeCode.UInt16 => typeof(decimal).GetMethod("op_Implicit", new[] { typeof(ushort) }), + NPTypeCode.Int32 => typeof(decimal).GetMethod("op_Implicit", new[] { typeof(int) }), + NPTypeCode.UInt32 => typeof(decimal).GetMethod("op_Implicit", new[] { typeof(uint) }), + NPTypeCode.Int64 => typeof(decimal).GetMethod("op_Implicit", new[] { typeof(long) }), + NPTypeCode.UInt64 => typeof(decimal).GetMethod("op_Implicit", new[] { typeof(ulong) }), + NPTypeCode.Single => typeof(decimal).GetMethod("op_Explicit", new[] { typeof(float) }), + NPTypeCode.Double => typeof(decimal).GetMethod("op_Explicit", new[] { typeof(double) }), + _ => throw new NotSupportedException($"Cannot convert {from} to decimal") + }; + il.EmitCall(OpCodes.Call, method!, null); + } + else + { + // Convert from decimal - need to handle bool/char + if (to == NPTypeCode.Boolean) + { + // decimal -> int -> bool (compare with 0) + il.EmitCall(OpCodes.Call, typeof(decimal).GetMethod("ToInt32", new[] { typeof(decimal) })!, null); + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Cgt_Un); + return; + } + if (to == NPTypeCode.Char) + { + // decimal -> int -> char + il.EmitCall(OpCodes.Call, typeof(decimal).GetMethod("ToInt32", new[] { typeof(decimal) })!, null); + il.Emit(OpCodes.Conv_U2); + return; + } + + var method = to switch + { + NPTypeCode.Byte => typeof(decimal).GetMethod("ToByte", new[] { typeof(decimal) }), + NPTypeCode.Int16 => typeof(decimal).GetMethod("ToInt16", new[] { typeof(decimal) }), + NPTypeCode.UInt16 => typeof(decimal).GetMethod("ToUInt16", new[] { typeof(decimal) }), + NPTypeCode.Int32 => typeof(decimal).GetMethod("ToInt32", new[] { typeof(decimal) }), + NPTypeCode.UInt32 => typeof(decimal).GetMethod("ToUInt32", new[] { typeof(decimal) }), + NPTypeCode.Int64 => typeof(decimal).GetMethod("ToInt64", new[] { typeof(decimal) }), + NPTypeCode.UInt64 => typeof(decimal).GetMethod("ToUInt64", new[] { typeof(decimal) }), + NPTypeCode.Single => typeof(decimal).GetMethod("ToSingle", new[] { typeof(decimal) }), + NPTypeCode.Double => typeof(decimal).GetMethod("ToDouble", new[] { typeof(decimal) }), + _ => throw new NotSupportedException($"Cannot convert decimal to {to}") + }; + il.EmitCall(OpCodes.Call, method!, null); + } + } + + /// + /// Check if type is unsigned. + /// + private static bool IsUnsigned(NPTypeCode type) + { + return type == NPTypeCode.Byte || type == NPTypeCode.UInt16 || + type == NPTypeCode.UInt32 || type == NPTypeCode.UInt64 || + type == NPTypeCode.Char; + } + + /// + /// Emit scalar operation for NPTypeCode. + /// + internal static void EmitScalarOperation(ILGenerator il, BinaryOp op, NPTypeCode resultType) + { + // Special handling for decimal (uses operator methods) + if (resultType == NPTypeCode.Decimal) + { + EmitDecimalOperation(il, op); + return; + } + + // Special handling for boolean + if (resultType == NPTypeCode.Boolean) + { + // For bool, only meaningful ops are probably logical, but we'll support arithmetic + // Treat as byte arithmetic + } + + var opcode = op switch + { + BinaryOp.Add => OpCodes.Add, + BinaryOp.Subtract => OpCodes.Sub, + BinaryOp.Multiply => OpCodes.Mul, + BinaryOp.Divide => IsUnsigned(resultType) ? OpCodes.Div_Un : OpCodes.Div, + BinaryOp.Mod => IsUnsigned(resultType) ? OpCodes.Rem_Un : OpCodes.Rem, + BinaryOp.BitwiseAnd => OpCodes.And, + BinaryOp.BitwiseOr => OpCodes.Or, + BinaryOp.BitwiseXor => OpCodes.Xor, + _ => throw new NotSupportedException($"Operation {op} not supported") + }; + + il.Emit(opcode); + } + + /// + /// Emit decimal-specific operation using operator methods. + /// + private static void EmitDecimalOperation(ILGenerator il, BinaryOp op) + { + // Bitwise operations not supported for decimal + if (op == BinaryOp.BitwiseAnd || op == BinaryOp.BitwiseOr || op == BinaryOp.BitwiseXor) + throw new NotSupportedException($"Bitwise operation {op} not supported for decimal type"); + + var methodName = op switch + { + BinaryOp.Add => "op_Addition", + BinaryOp.Subtract => "op_Subtraction", + BinaryOp.Multiply => "op_Multiply", + BinaryOp.Divide => "op_Division", + BinaryOp.Mod => "op_Modulus", + _ => throw new NotSupportedException($"Operation {op} not supported for decimal") + }; + + var method = typeof(decimal).GetMethod( + methodName, + BindingFlags.Public | BindingFlags.Static, + null, + new[] { typeof(decimal), typeof(decimal) }, + null + ); + + il.EmitCall(OpCodes.Call, method!, null); + } + + /// + /// Emit Vector256.Load for NPTypeCode. + /// + internal static void EmitVectorLoad(ILGenerator il, NPTypeCode type) + { + var clrType = GetClrType(type); + var loadMethod = typeof(Vector256) + .GetMethods(BindingFlags.Public | BindingFlags.Static) + .First(m => m.Name == "Load" && m.IsGenericMethod && m.GetParameters().Length == 1) + .MakeGenericMethod(clrType); + + il.EmitCall(OpCodes.Call, loadMethod, null); + } + + /// + /// Emit Vector256.Store for NPTypeCode. + /// + internal static void EmitVectorStore(ILGenerator il, NPTypeCode type) + { + var clrType = GetClrType(type); + var vectorType = typeof(Vector256<>).MakeGenericType(clrType); + var ptrType = clrType.MakePointerType(); + + var storeMethod = typeof(Vector256) + .GetMethods(BindingFlags.Public | BindingFlags.Static) + .Where(m => m.Name == "Store" && m.IsGenericMethod) + .Select(m => m.MakeGenericMethod(clrType)) + .FirstOrDefault(m => + { + var p = m.GetParameters(); + return p.Length == 2 && + p[0].ParameterType == vectorType && + p[1].ParameterType == ptrType; + }); + + if (storeMethod == null) + throw new InvalidOperationException($"Could not find Vector256.Store for {type}"); + + il.EmitCall(OpCodes.Call, storeMethod, null); + } + + /// + /// Emit Vector256 operation for NPTypeCode. + /// + internal static void EmitVectorOperation(ILGenerator il, BinaryOp op, NPTypeCode type) + { + var clrType = GetClrType(type); + var vectorType = typeof(Vector256<>).MakeGenericType(clrType); + + var methodName = op switch + { + BinaryOp.Add => "op_Addition", + BinaryOp.Subtract => "op_Subtraction", + BinaryOp.Multiply => "op_Multiply", + BinaryOp.Divide => "op_Division", + _ => throw new NotSupportedException($"SIMD operation {op} not supported") + }; + + var opMethod = vectorType.GetMethod( + methodName, + BindingFlags.Public | BindingFlags.Static, + null, + new[] { vectorType, vectorType }, + null + ); + + if (opMethod == null) + throw new InvalidOperationException($"Could not find {methodName} for Vector256<{type}>"); + + il.EmitCall(OpCodes.Call, opMethod, null); + } + + #endregion + + #region Unary Kernel Generation + + /// + /// Cache for unary kernels. + /// Key: UnaryKernelKey (InputType, OutputType, Op, IsContiguous) + /// + private static readonly ConcurrentDictionary _unaryCache = new(); + + /// + /// Number of unary kernels in cache. + /// + public static int UnaryCachedCount => _unaryCache.Count; + + /// + /// Get or generate a unary kernel for the specified key. + /// + public static UnaryKernel GetUnaryKernel(UnaryKernelKey key) + { + if (!Enabled) + throw new InvalidOperationException("IL generation is disabled"); + + return _unaryCache.GetOrAdd(key, GenerateUnaryKernel); + } + + /// + /// Try to get or generate a unary kernel. Returns null if generation fails. + /// + public static UnaryKernel? TryGetUnaryKernel(UnaryKernelKey key) + { + if (!Enabled) + return null; + + try + { + return _unaryCache.GetOrAdd(key, GenerateUnaryKernel); + } + catch + { + return null; + } + } + + /// + /// Clear the unary kernel cache. + /// + public static void ClearUnary() => _unaryCache.Clear(); + + /// + /// Generate a unary kernel for the specified key. + /// + private static UnaryKernel GenerateUnaryKernel(UnaryKernelKey key) + { + // UnaryKernel signature: + // void(void* input, void* output, int* strides, int* shape, int ndim, int totalSize) + var dm = new DynamicMethod( + name: $"Unary_{key}", + returnType: typeof(void), + parameterTypes: new[] + { + typeof(void*), typeof(void*), + typeof(int*), typeof(int*), + typeof(int), typeof(int) + }, + owner: typeof(ILKernelGenerator), + skipVisibility: true + ); + + var il = dm.GetILGenerator(); + + int inputSize = GetTypeSize(key.InputType); + int outputSize = GetTypeSize(key.OutputType); + + if (key.IsContiguous) + { + // Check if we can use SIMD for this operation + bool canSimd = CanUseUnarySimd(key); + if (canSimd) + { + EmitUnarySimdLoop(il, key, inputSize, outputSize); + } + else + { + EmitUnaryScalarLoop(il, key, inputSize, outputSize); + } + } + else + { + EmitUnaryStridedLoop(il, key, inputSize, outputSize); + } + + il.Emit(OpCodes.Ret); + return dm.CreateDelegate(); + } + + /// + /// Check if SIMD can be used for this unary operation. + /// + private static bool CanUseUnarySimd(UnaryKernelKey key) + { + // SIMD only for same-type operations on float/double + if (!key.IsSameType) + return false; + + // Only float and double have good SIMD support for unary ops + if (key.InputType != NPTypeCode.Single && key.InputType != NPTypeCode.Double) + return false; + + // Only certain operations have SIMD support + return key.Op == UnaryOp.Negate || key.Op == UnaryOp.Abs || key.Op == UnaryOp.Sqrt; + } + + /// + /// Emit SIMD loop for contiguous unary operations. + /// + private static void EmitUnarySimdLoop(ILGenerator il, UnaryKernelKey key, + int inputSize, int outputSize) + { + int vectorCount = GetVectorCount(key.InputType); + + var locI = il.DeclareLocal(typeof(int)); // loop counter + var locVectorEnd = il.DeclareLocal(typeof(int)); // totalSize - vectorCount + + var lblSimdLoop = il.DefineLabel(); + var lblSimdLoopEnd = il.DefineLabel(); + var lblTailLoop = il.DefineLabel(); + var lblTailLoopEnd = il.DefineLabel(); + + // vectorEnd = totalSize - vectorCount + il.Emit(OpCodes.Ldarg_S, (byte)5); // totalSize + il.Emit(OpCodes.Ldc_I4, vectorCount); + il.Emit(OpCodes.Sub); + il.Emit(OpCodes.Stloc, locVectorEnd); + + // i = 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locI); + + // === SIMD LOOP === + il.MarkLabel(lblSimdLoop); + + // if (i > vectorEnd) goto SimdLoopEnd + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldloc, locVectorEnd); + il.Emit(OpCodes.Bgt, lblSimdLoopEnd); + + // Load input vector + il.Emit(OpCodes.Ldarg_0); // input + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, inputSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitVectorLoad(il, key.InputType); + + // Vector operation + EmitUnaryVectorOperation(il, key.Op, key.InputType); + + // Store result vector + il.Emit(OpCodes.Ldarg_1); // output + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, outputSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitVectorStore(il, key.OutputType); + + // i += vectorCount + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4, vectorCount); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblSimdLoop); + il.MarkLabel(lblSimdLoopEnd); + + // === TAIL LOOP === + il.MarkLabel(lblTailLoop); + + // if (i >= totalSize) goto end + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldarg_S, (byte)5); // totalSize + il.Emit(OpCodes.Bge, lblTailLoopEnd); + + // output[i] = op(input[i]) + il.Emit(OpCodes.Ldarg_1); // output + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, outputSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + + il.Emit(OpCodes.Ldarg_0); // input + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, inputSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.InputType); + EmitConvertTo(il, key.InputType, key.OutputType); + + EmitUnaryScalarOperation(il, key.Op, key.OutputType); + EmitStoreIndirect(il, key.OutputType); + + // i++ + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblTailLoop); + il.MarkLabel(lblTailLoopEnd); + } + + /// + /// Emit scalar loop for contiguous unary operations (no SIMD). + /// + private static void EmitUnaryScalarLoop(ILGenerator il, UnaryKernelKey key, + int inputSize, int outputSize) + { + // Args: void* input (0), void* output (1), + // int* strides (2), int* shape (3), + // int ndim (4), int totalSize (5) + + var locI = il.DeclareLocal(typeof(int)); // loop counter + + var lblLoop = il.DefineLabel(); + var lblLoopEnd = il.DefineLabel(); + + // i = 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locI); + + il.MarkLabel(lblLoop); + + // if (i >= totalSize) goto end + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldarg_S, (byte)5); // totalSize + il.Emit(OpCodes.Bge, lblLoopEnd); + + // output[i] = op(input[i]) + // Load output address + il.Emit(OpCodes.Ldarg_1); // output + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, outputSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + + // Load input[i] and convert to output type + il.Emit(OpCodes.Ldarg_0); // input + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, inputSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.InputType); + EmitConvertTo(il, key.InputType, key.OutputType); + + // Perform operation + EmitUnaryScalarOperation(il, key.Op, key.OutputType); + + // Store result + EmitStoreIndirect(il, key.OutputType); + + // i++ + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblLoop); + il.MarkLabel(lblLoopEnd); + } + + /// + /// Emit strided loop for non-contiguous unary operations. + /// Uses coordinate-based iteration. + /// + private static void EmitUnaryStridedLoop(ILGenerator il, UnaryKernelKey key, + int inputSize, int outputSize) + { + // Args: void* input (0), void* output (1), + // int* strides (2), int* shape (3), + // int ndim (4), int totalSize (5) + + var locI = il.DeclareLocal(typeof(int)); // linear index + var locD = il.DeclareLocal(typeof(int)); // dimension counter + var locInputOffset = il.DeclareLocal(typeof(int)); // input offset + var locCoord = il.DeclareLocal(typeof(int)); // current coordinate + var locIdx = il.DeclareLocal(typeof(int)); // temp for coordinate calculation + + var lblLoop = il.DefineLabel(); + var lblLoopEnd = il.DefineLabel(); + var lblDimLoop = il.DefineLabel(); + var lblDimLoopEnd = il.DefineLabel(); + + // i = 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locI); + + // Main loop + il.MarkLabel(lblLoop); + + // if (i >= totalSize) goto end + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldarg_S, (byte)5); // totalSize + il.Emit(OpCodes.Bge, lblLoopEnd); + + // Calculate inputOffset from linear index + // inputOffset = 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locInputOffset); + + // idx = i (for coordinate calculation) + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Stloc, locIdx); + + // For each dimension (right to left): coord = idx % shape[d], idx /= shape[d] + // d = ndim - 1 + il.Emit(OpCodes.Ldarg_S, (byte)4); // ndim + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Sub); + il.Emit(OpCodes.Stloc, locD); + + il.MarkLabel(lblDimLoop); + + // if (d < 0) goto DimLoopEnd + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Blt, lblDimLoopEnd); + + // coord = idx % shape[d] + il.Emit(OpCodes.Ldloc, locIdx); + il.Emit(OpCodes.Ldarg_3); // shape + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4_4); // sizeof(int) + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Ldind_I4); + il.Emit(OpCodes.Rem); + il.Emit(OpCodes.Stloc, locCoord); + + // idx /= shape[d] + il.Emit(OpCodes.Ldloc, locIdx); + il.Emit(OpCodes.Ldarg_3); // shape + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4_4); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Ldind_I4); + il.Emit(OpCodes.Div); + il.Emit(OpCodes.Stloc, locIdx); + + // inputOffset += coord * strides[d] + il.Emit(OpCodes.Ldloc, locInputOffset); + il.Emit(OpCodes.Ldloc, locCoord); + il.Emit(OpCodes.Ldarg_2); // strides + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4_4); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Ldind_I4); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locInputOffset); + + // d-- + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Sub); + il.Emit(OpCodes.Stloc, locD); + + il.Emit(OpCodes.Br, lblDimLoop); + il.MarkLabel(lblDimLoopEnd); + + // Now compute: output[i] = op(input[inputOffset]) + // Load output address (contiguous output) + il.Emit(OpCodes.Ldarg_1); // output + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, outputSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + + // Load input[inputOffset] + il.Emit(OpCodes.Ldarg_0); // input + il.Emit(OpCodes.Ldloc, locInputOffset); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, inputSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.InputType); + EmitConvertTo(il, key.InputType, key.OutputType); + + // Operation + EmitUnaryScalarOperation(il, key.Op, key.OutputType); + + // Store + EmitStoreIndirect(il, key.OutputType); + + // i++ + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblLoop); + il.MarkLabel(lblLoopEnd); + } + + /// + /// Emit unary scalar operation. + /// + internal static void EmitUnaryScalarOperation(ILGenerator il, UnaryOp op, NPTypeCode type) + { + // Special handling for decimal + if (type == NPTypeCode.Decimal) + { + EmitUnaryDecimalOperation(il, op); + return; + } + + switch (op) + { + case UnaryOp.Negate: + // For unsigned types, use two's complement: ~val + 1 + // For signed types, use neg opcode + if (IsUnsigned(type)) + { + // ~val + 1 = two's complement negation + il.Emit(OpCodes.Not); + il.Emit(OpCodes.Ldc_I4_1); + // Need to widen to correct type before add + if (type == NPTypeCode.UInt64) + { + il.Emit(OpCodes.Conv_U8); + } + il.Emit(OpCodes.Add); + } + else + { + il.Emit(OpCodes.Neg); + } + break; + + case UnaryOp.Abs: + EmitMathCall(il, "Abs", type); + break; + + case UnaryOp.Sqrt: + EmitMathCall(il, "Sqrt", type); + break; + + case UnaryOp.Exp: + EmitMathCall(il, "Exp", type); + break; + + case UnaryOp.Log: + EmitMathCall(il, "Log", type); + break; + + case UnaryOp.Sin: + EmitMathCall(il, "Sin", type); + break; + + case UnaryOp.Cos: + EmitMathCall(il, "Cos", type); + break; + + case UnaryOp.Tan: + EmitMathCall(il, "Tan", type); + break; + + case UnaryOp.Sinh: + EmitMathCall(il, "Sinh", type); + break; + + case UnaryOp.Cosh: + EmitMathCall(il, "Cosh", type); + break; + + case UnaryOp.Tanh: + EmitMathCall(il, "Tanh", type); + break; + + case UnaryOp.ASin: + EmitMathCall(il, "Asin", type); + break; + + case UnaryOp.ACos: + EmitMathCall(il, "Acos", type); + break; + + case UnaryOp.ATan: + EmitMathCall(il, "Atan", type); + break; + + case UnaryOp.Exp2: + // Use Math.Pow(2, x) since Math.Exp2 may not be available + EmitExp2Call(il, type); + break; + + case UnaryOp.Expm1: + // exp(x) - 1: call Exp then subtract 1 + EmitMathCall(il, "Exp", type); + EmitSubtractOne(il, type); + break; + + case UnaryOp.Log2: + EmitMathCall(il, "Log2", type); + break; + + case UnaryOp.Log10: + EmitMathCall(il, "Log10", type); + break; + + case UnaryOp.Log1p: + // log(1 + x): add 1 then call Log + EmitAddOne(il, type); + EmitMathCall(il, "Log", type); + break; + + case UnaryOp.Sign: + EmitSignCall(il, type); + break; + + case UnaryOp.Ceil: + EmitMathCall(il, "Ceiling", type); + break; + + case UnaryOp.Floor: + EmitMathCall(il, "Floor", type); + break; + + case UnaryOp.Round: + EmitMathCall(il, "Round", type); + break; + + default: + throw new NotSupportedException($"Unary operation {op} not supported"); + } + } + + /// + /// Emit call to Math.X method with appropriate overload. + /// + private static void EmitMathCall(ILGenerator il, string methodName, NPTypeCode type) + { + MethodInfo? method; + + if (type == NPTypeCode.Single) + { + // Use MathF for float + method = typeof(MathF).GetMethod(methodName, new[] { typeof(float) }); + } + else if (type == NPTypeCode.Double) + { + // Use Math for double + method = typeof(Math).GetMethod(methodName, new[] { typeof(double) }); + } + else + { + // For integer types, convert to double, call Math, convert back + // Stack has: value (as output type) + // Need to: conv to double, call Math.X, conv back + + // Convert to double first + EmitConvertToDouble(il, type); + + // Call Math.X(double) + method = typeof(Math).GetMethod(methodName, new[] { typeof(double) }); + il.EmitCall(OpCodes.Call, method!, null); + + // Convert back to target type + EmitConvertFromDouble(il, type); + return; + } + + il.EmitCall(OpCodes.Call, method!, null); + } + + /// + /// Convert stack value to double. + /// + private static void EmitConvertToDouble(ILGenerator il, NPTypeCode from) + { + if (from == NPTypeCode.Double) + return; + + if (IsUnsigned(from)) + il.Emit(OpCodes.Conv_R_Un); + il.Emit(OpCodes.Conv_R8); + } + + /// + /// Convert double on stack to target type. + /// + private static void EmitConvertFromDouble(ILGenerator il, NPTypeCode to) + { + if (to == NPTypeCode.Double) + return; + + switch (to) + { + case NPTypeCode.Boolean: + il.Emit(OpCodes.Ldc_R8, 0.0); + il.Emit(OpCodes.Cgt_Un); + break; + case NPTypeCode.Byte: + il.Emit(OpCodes.Conv_U1); + break; + case NPTypeCode.Int16: + il.Emit(OpCodes.Conv_I2); + break; + case NPTypeCode.UInt16: + case NPTypeCode.Char: + il.Emit(OpCodes.Conv_U2); + break; + case NPTypeCode.Int32: + il.Emit(OpCodes.Conv_I4); + break; + case NPTypeCode.UInt32: + il.Emit(OpCodes.Conv_U4); + break; + case NPTypeCode.Int64: + il.Emit(OpCodes.Conv_I8); + break; + case NPTypeCode.UInt64: + il.Emit(OpCodes.Conv_U8); + break; + case NPTypeCode.Single: + il.Emit(OpCodes.Conv_R4); + break; + default: + throw new NotSupportedException($"Conversion to {to} not supported"); + } + } + + /// + /// Emit 2^x calculation using Math.Pow(2, x). + /// + private static void EmitExp2Call(ILGenerator il, NPTypeCode type) + { + if (type == NPTypeCode.Single) + { + // For float: convert to double, call Pow, convert back + il.Emit(OpCodes.Conv_R8); + il.Emit(OpCodes.Ldc_R8, 2.0); + // Stack: [exponent, base] - but Pow expects (base, exponent) + // Need to swap them + var locExp = il.DeclareLocal(typeof(double)); + il.Emit(OpCodes.Stloc, locExp); // Save exponent + // Now push base then exponent + il.Emit(OpCodes.Ldc_R8, 2.0); + il.Emit(OpCodes.Ldloc, locExp); + il.EmitCall(OpCodes.Call, typeof(Math).GetMethod("Pow", new[] { typeof(double), typeof(double) })!, null); + il.Emit(OpCodes.Conv_R4); + } + else if (type == NPTypeCode.Double) + { + // For double: just call Pow + var locExp = il.DeclareLocal(typeof(double)); + il.Emit(OpCodes.Stloc, locExp); // Save exponent + il.Emit(OpCodes.Ldc_R8, 2.0); + il.Emit(OpCodes.Ldloc, locExp); + il.EmitCall(OpCodes.Call, typeof(Math).GetMethod("Pow", new[] { typeof(double), typeof(double) })!, null); + } + else + { + // For integer types: convert to double, call Pow, convert back + EmitConvertToDouble(il, type); + var locExp = il.DeclareLocal(typeof(double)); + il.Emit(OpCodes.Stloc, locExp); // Save exponent + il.Emit(OpCodes.Ldc_R8, 2.0); + il.Emit(OpCodes.Ldloc, locExp); + il.EmitCall(OpCodes.Call, typeof(Math).GetMethod("Pow", new[] { typeof(double), typeof(double) })!, null); + EmitConvertFromDouble(il, type); + } + } + + /// + /// Emit subtraction of 1 from the value on stack. + /// Used for expm1 = exp(x) - 1. + /// + private static void EmitSubtractOne(ILGenerator il, NPTypeCode type) + { + switch (type) + { + case NPTypeCode.Single: + il.Emit(OpCodes.Ldc_R4, 1.0f); + il.Emit(OpCodes.Sub); + break; + case NPTypeCode.Double: + il.Emit(OpCodes.Ldc_R8, 1.0); + il.Emit(OpCodes.Sub); + break; + default: + // For integer types, value is already double from math call + il.Emit(OpCodes.Ldc_R8, 1.0); + il.Emit(OpCodes.Sub); + break; + } + } + + /// + /// Emit addition of 1 to the value on stack. + /// Used for log1p = log(1 + x). + /// + private static void EmitAddOne(ILGenerator il, NPTypeCode type) + { + // Convert to appropriate float type first, then add 1 + if (type == NPTypeCode.Single) + { + il.Emit(OpCodes.Ldc_R4, 1.0f); + il.Emit(OpCodes.Add); + } + else if (type == NPTypeCode.Double) + { + il.Emit(OpCodes.Ldc_R8, 1.0); + il.Emit(OpCodes.Add); + } + else + { + // For integer types, convert to double first, then add 1 + // The conversion to double will happen in EmitMathCall + EmitConvertToDouble(il, type); + il.Emit(OpCodes.Ldc_R8, 1.0); + il.Emit(OpCodes.Add); + } + } + + /// + /// Emit Math.Sign call with proper type conversion. + /// Math.Sign returns int, so we need to convert back to target type. + /// NumPy: sign(NaN) returns NaN, but .NET Math.Sign throws ArithmeticException. + /// We check for NaN first and return it directly. + /// + private static void EmitSignCall(ILGenerator il, NPTypeCode type) + { + if (type == NPTypeCode.Single) + { + // NumPy: sign(NaN) = NaN. .NET MathF.Sign(NaN) throws. + // Check for NaN first: if (float.IsNaN(x)) return x; else return MathF.Sign(x); + var lblNotNaN = il.DefineLabel(); + var lblEnd = il.DefineLabel(); + + il.Emit(OpCodes.Dup); // duplicate for NaN check + il.EmitCall(OpCodes.Call, typeof(float).GetMethod("IsNaN", new[] { typeof(float) })!, null); + il.Emit(OpCodes.Brfalse, lblNotNaN); + + // Is NaN - value is already on stack, jump to end + il.Emit(OpCodes.Br, lblEnd); + + il.MarkLabel(lblNotNaN); + // Not NaN - call MathF.Sign + var method = typeof(MathF).GetMethod("Sign", new[] { typeof(float) }); + il.EmitCall(OpCodes.Call, method!, null); + il.Emit(OpCodes.Conv_R4); + + il.MarkLabel(lblEnd); + } + else if (type == NPTypeCode.Double) + { + // NumPy: sign(NaN) = NaN. .NET Math.Sign(NaN) throws. + // Check for NaN first: if (double.IsNaN(x)) return x; else return Math.Sign(x); + var lblNotNaN = il.DefineLabel(); + var lblEnd = il.DefineLabel(); + + il.Emit(OpCodes.Dup); // duplicate for NaN check + il.EmitCall(OpCodes.Call, typeof(double).GetMethod("IsNaN", new[] { typeof(double) })!, null); + il.Emit(OpCodes.Brfalse, lblNotNaN); + + // Is NaN - value is already on stack, jump to end + il.Emit(OpCodes.Br, lblEnd); + + il.MarkLabel(lblNotNaN); + // Not NaN - call Math.Sign + var method = typeof(Math).GetMethod("Sign", new[] { typeof(double) }); + il.EmitCall(OpCodes.Call, method!, null); + il.Emit(OpCodes.Conv_R8); + + il.MarkLabel(lblEnd); + } + else if (type == NPTypeCode.Decimal) + { + // Decimal has its own Sign method that returns int + var method = typeof(Math).GetMethod("Sign", new[] { typeof(decimal) }); + il.EmitCall(OpCodes.Call, method!, null); + // Convert int to decimal + il.EmitCall(OpCodes.Call, typeof(decimal).GetMethod("op_Implicit", new[] { typeof(int) })!, null); + } + else + { + // For integer types: convert to double, call Math.Sign, convert back + EmitConvertToDouble(il, type); + var method = typeof(Math).GetMethod("Sign", new[] { typeof(double) }); + il.EmitCall(OpCodes.Call, method!, null); + // Convert int result back to target type + EmitConvertFromInt(il, type); + } + } + + /// + /// Convert int on stack to target type. + /// + private static void EmitConvertFromInt(ILGenerator il, NPTypeCode to) + { + switch (to) + { + case NPTypeCode.Boolean: + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Cgt_Un); + break; + case NPTypeCode.Byte: + il.Emit(OpCodes.Conv_U1); + break; + case NPTypeCode.Int16: + il.Emit(OpCodes.Conv_I2); + break; + case NPTypeCode.UInt16: + case NPTypeCode.Char: + il.Emit(OpCodes.Conv_U2); + break; + case NPTypeCode.Int32: + // Already int, no conversion needed + break; + case NPTypeCode.UInt32: + il.Emit(OpCodes.Conv_U4); + break; + case NPTypeCode.Int64: + il.Emit(OpCodes.Conv_I8); + break; + case NPTypeCode.UInt64: + il.Emit(OpCodes.Conv_U8); + break; + case NPTypeCode.Single: + il.Emit(OpCodes.Conv_R4); + break; + case NPTypeCode.Double: + il.Emit(OpCodes.Conv_R8); + break; + default: + throw new NotSupportedException($"Conversion from int to {to} not supported"); + } + } + + /// + /// Emit unary operation for decimal type. + /// + private static void EmitUnaryDecimalOperation(ILGenerator il, UnaryOp op) + { + switch (op) + { + case UnaryOp.Negate: + il.EmitCall(OpCodes.Call, + typeof(decimal).GetMethod("op_UnaryNegation", new[] { typeof(decimal) })!, + null); + break; + + case UnaryOp.Abs: + il.EmitCall(OpCodes.Call, + typeof(Math).GetMethod("Abs", new[] { typeof(decimal) })!, + null); + break; + + case UnaryOp.Sign: + // Math.Sign(decimal) returns int, convert back to decimal + il.EmitCall(OpCodes.Call, + typeof(Math).GetMethod("Sign", new[] { typeof(decimal) })!, + null); + il.EmitCall(OpCodes.Call, + typeof(decimal).GetMethod("op_Implicit", new[] { typeof(int) })!, + null); + break; + + case UnaryOp.Ceil: + // Math.Ceiling has decimal overload + il.EmitCall(OpCodes.Call, + typeof(Math).GetMethod("Ceiling", new[] { typeof(decimal) })!, + null); + break; + + case UnaryOp.Floor: + // Math.Floor has decimal overload + il.EmitCall(OpCodes.Call, + typeof(Math).GetMethod("Floor", new[] { typeof(decimal) })!, + null); + break; + + case UnaryOp.Round: + // Math.Round has decimal overload + il.EmitCall(OpCodes.Call, + typeof(Math).GetMethod("Round", new[] { typeof(decimal) })!, + null); + break; + + case UnaryOp.Sqrt: + case UnaryOp.Exp: + case UnaryOp.Log: + case UnaryOp.Sin: + case UnaryOp.Cos: + case UnaryOp.Tan: + case UnaryOp.Sinh: + case UnaryOp.Cosh: + case UnaryOp.Tanh: + case UnaryOp.ASin: + case UnaryOp.ACos: + case UnaryOp.ATan: + case UnaryOp.Log2: + case UnaryOp.Log10: + // Convert to double, perform operation, convert back + il.EmitCall(OpCodes.Call, + typeof(decimal).GetMethod("ToDouble", new[] { typeof(decimal) })!, + null); + + string mathMethod = op switch + { + UnaryOp.Sqrt => "Sqrt", + UnaryOp.Exp => "Exp", + UnaryOp.Log => "Log", + UnaryOp.Sin => "Sin", + UnaryOp.Cos => "Cos", + UnaryOp.Tan => "Tan", + UnaryOp.Sinh => "Sinh", + UnaryOp.Cosh => "Cosh", + UnaryOp.Tanh => "Tanh", + UnaryOp.ASin => "Asin", + UnaryOp.ACos => "Acos", + UnaryOp.ATan => "Atan", + UnaryOp.Log2 => "Log2", + UnaryOp.Log10 => "Log10", + _ => throw new NotSupportedException() + }; + + il.EmitCall(OpCodes.Call, + typeof(Math).GetMethod(mathMethod, new[] { typeof(double) })!, + null); + + il.EmitCall(OpCodes.Call, + typeof(decimal).GetMethod("op_Explicit", new[] { typeof(double) })!, + null); + break; + + case UnaryOp.Exp2: + // 2^x for decimal: convert to double, use Math.Pow, convert back + il.EmitCall(OpCodes.Call, + typeof(decimal).GetMethod("ToDouble", new[] { typeof(decimal) })!, + null); + // Stack: [exponent (double)] - need to call Pow(2, exponent) + var locExpDec = il.DeclareLocal(typeof(double)); + il.Emit(OpCodes.Stloc, locExpDec); + il.Emit(OpCodes.Ldc_R8, 2.0); + il.Emit(OpCodes.Ldloc, locExpDec); + il.EmitCall(OpCodes.Call, + typeof(Math).GetMethod("Pow", new[] { typeof(double), typeof(double) })!, + null); + il.EmitCall(OpCodes.Call, + typeof(decimal).GetMethod("op_Explicit", new[] { typeof(double) })!, + null); + break; + + case UnaryOp.Expm1: + // exp(x) - 1 for decimal + il.EmitCall(OpCodes.Call, + typeof(decimal).GetMethod("ToDouble", new[] { typeof(decimal) })!, + null); + il.EmitCall(OpCodes.Call, + typeof(Math).GetMethod("Exp", new[] { typeof(double) })!, + null); + il.Emit(OpCodes.Ldc_R8, 1.0); + il.Emit(OpCodes.Sub); + il.EmitCall(OpCodes.Call, + typeof(decimal).GetMethod("op_Explicit", new[] { typeof(double) })!, + null); + break; + + case UnaryOp.Log1p: + // log(1 + x) for decimal + il.EmitCall(OpCodes.Call, + typeof(decimal).GetMethod("ToDouble", new[] { typeof(decimal) })!, + null); + il.Emit(OpCodes.Ldc_R8, 1.0); + il.Emit(OpCodes.Add); + il.EmitCall(OpCodes.Call, + typeof(Math).GetMethod("Log", new[] { typeof(double) })!, + null); + il.EmitCall(OpCodes.Call, + typeof(decimal).GetMethod("op_Explicit", new[] { typeof(double) })!, + null); + break; + + default: + throw new NotSupportedException($"Unary operation {op} not supported for decimal"); + } + } + + /// + /// Emit Vector256 unary operation. + /// + private static void EmitUnaryVectorOperation(ILGenerator il, UnaryOp op, NPTypeCode type) + { + var clrType = GetClrType(type); + var vectorType = typeof(Vector256<>).MakeGenericType(clrType); + + string methodName = op switch + { + UnaryOp.Negate => "op_UnaryNegation", + UnaryOp.Abs => "Abs", + UnaryOp.Sqrt => "Sqrt", + _ => throw new NotSupportedException($"SIMD operation {op} not supported") + }; + + MethodInfo? method; + + if (op == UnaryOp.Negate) + { + // Negation is an operator on Vector256 + method = vectorType.GetMethod(methodName, BindingFlags.Public | BindingFlags.Static, + null, new[] { vectorType }, null); + } + else + { + // Abs and Sqrt are static methods on Vector256 + method = typeof(Vector256).GetMethods(BindingFlags.Public | BindingFlags.Static) + .Where(m => m.Name == methodName && m.IsGenericMethod && m.GetParameters().Length == 1) + .Select(m => m.MakeGenericMethod(clrType)) + .FirstOrDefault(m => m.GetParameters()[0].ParameterType == vectorType); + } + + if (method == null) + throw new InvalidOperationException($"Could not find {methodName} for Vector256<{type}>"); + + il.EmitCall(OpCodes.Call, method, null); + } + + #endregion + + #region Scalar Kernel Generation + + /// + /// Cache for unary scalar kernels. + /// Key: UnaryScalarKernelKey (InputType, OutputType, Op) + /// Value: Delegate (Func<TInput, TOutput>) + /// + private static readonly ConcurrentDictionary _unaryScalarCache = new(); + + /// + /// Cache for binary scalar kernels. + /// Key: BinaryScalarKernelKey (LhsType, RhsType, ResultType, Op) + /// Value: Delegate (Func<TLhs, TRhs, TResult>) + /// + private static readonly ConcurrentDictionary _binaryScalarCache = new(); + + /// + /// Number of unary scalar kernels in cache. + /// + public static int UnaryScalarCachedCount => _unaryScalarCache.Count; + + /// + /// Number of binary scalar kernels in cache. + /// + public static int BinaryScalarCachedCount => _binaryScalarCache.Count; + + /// + /// Clear the scalar kernel caches. + /// + public static void ClearScalar() + { + _unaryScalarCache.Clear(); + _binaryScalarCache.Clear(); + } + + /// + /// Get or generate an IL-based unary scalar delegate. + /// Returns a Func<TInput, TOutput> delegate. + /// + public static Delegate GetUnaryScalarDelegate(UnaryScalarKernelKey key) + { + if (!Enabled) + throw new InvalidOperationException("IL generation is disabled"); + + return _unaryScalarCache.GetOrAdd(key, GenerateUnaryScalarDelegate); + } + + /// + /// Get or generate an IL-based binary scalar delegate. + /// Returns a Func<TLhs, TRhs, TResult> delegate. + /// + public static Delegate GetBinaryScalarDelegate(BinaryScalarKernelKey key) + { + if (!Enabled) + throw new InvalidOperationException("IL generation is disabled"); + + return _binaryScalarCache.GetOrAdd(key, GenerateBinaryScalarDelegate); + } + + /// + /// Generate an IL-based unary scalar delegate. + /// Creates a Func<TInput, TOutput> that performs the operation. + /// + private static Delegate GenerateUnaryScalarDelegate(UnaryScalarKernelKey key) + { + var inputClr = GetClrType(key.InputType); + var outputClr = GetClrType(key.OutputType); + + // Create DynamicMethod: TOutput Method(TInput input) + var dm = new DynamicMethod( + name: $"ScalarUnary_{key}", + returnType: outputClr, + parameterTypes: new[] { inputClr }, + owner: typeof(ILKernelGenerator), + skipVisibility: true + ); + + var il = dm.GetILGenerator(); + + // Load input argument + il.Emit(OpCodes.Ldarg_0); + + // Convert to output type if different + EmitConvertTo(il, key.InputType, key.OutputType); + + // Perform the unary operation (result is on stack) + EmitUnaryScalarOperation(il, key.Op, key.OutputType); + + // Return + il.Emit(OpCodes.Ret); + + // Create typed Func + var funcType = typeof(Func<,>).MakeGenericType(inputClr, outputClr); + return dm.CreateDelegate(funcType); + } + + /// + /// Generate an IL-based binary scalar delegate. + /// Creates a Func<TLhs, TRhs, TResult> that performs the operation. + /// + private static Delegate GenerateBinaryScalarDelegate(BinaryScalarKernelKey key) + { + var lhsClr = GetClrType(key.LhsType); + var rhsClr = GetClrType(key.RhsType); + var resultClr = GetClrType(key.ResultType); + + // Create DynamicMethod: TResult Method(TLhs lhs, TRhs rhs) + var dm = new DynamicMethod( + name: $"ScalarBinary_{key}", + returnType: resultClr, + parameterTypes: new[] { lhsClr, rhsClr }, + owner: typeof(ILKernelGenerator), + skipVisibility: true + ); + + var il = dm.GetILGenerator(); + + // Load lhs, convert to result type + il.Emit(OpCodes.Ldarg_0); + EmitConvertTo(il, key.LhsType, key.ResultType); + + // Load rhs, convert to result type + il.Emit(OpCodes.Ldarg_1); + EmitConvertTo(il, key.RhsType, key.ResultType); + + // Perform binary operation + EmitScalarOperation(il, key.Op, key.ResultType); + + // Return + il.Emit(OpCodes.Ret); + + // Create typed Func + var funcType = typeof(Func<,,>).MakeGenericType(lhsClr, rhsClr, resultClr); + return dm.CreateDelegate(funcType); + } + + #endregion + + #region Comparison Kernel Generation + + /// + /// Cache for comparison kernels. + /// Key: ComparisonKernelKey (LhsType, RhsType, Op, Path) + /// + private static readonly ConcurrentDictionary _comparisonCache = new(); + + /// + /// Number of comparison kernels in cache. + /// + public static int ComparisonCachedCount => _comparisonCache.Count; + + /// + /// Clear the comparison kernel cache. + /// + public static void ClearComparison() => _comparisonCache.Clear(); + + /// + /// Get or generate a comparison kernel for the specified key. + /// + public static ComparisonKernel GetComparisonKernel(ComparisonKernelKey key) + { + if (!Enabled) + throw new InvalidOperationException("IL generation is disabled"); + + return _comparisonCache.GetOrAdd(key, GenerateComparisonKernel); + } + + /// + /// Try to get or generate a comparison kernel. Returns null if generation fails. + /// + public static ComparisonKernel? TryGetComparisonKernel(ComparisonKernelKey key) + { + if (!Enabled) + return null; + + try + { + return _comparisonCache.GetOrAdd(key, GenerateComparisonKernel); + } + catch + { + return null; + } + } + + /// + /// Generate a comparison kernel for the specified key. + /// + private static ComparisonKernel GenerateComparisonKernel(ComparisonKernelKey key) + { + return key.Path switch + { + ExecutionPath.SimdFull => GenerateComparisonSimdFullKernel(key), + ExecutionPath.SimdScalarRight => GenerateComparisonScalarRightKernel(key), + ExecutionPath.SimdScalarLeft => GenerateComparisonScalarLeftKernel(key), + ExecutionPath.SimdChunk => GenerateComparisonGeneralKernel(key), // Fall through to general + ExecutionPath.General => GenerateComparisonGeneralKernel(key), + _ => throw new NotSupportedException($"Path {key.Path} not supported") + }; + } + + /// + /// Generate a comparison kernel for contiguous arrays. + /// + private static ComparisonKernel GenerateComparisonSimdFullKernel(ComparisonKernelKey key) + { + // ComparisonKernel signature: + // void(void* lhs, void* rhs, bool* result, int* lhsStrides, int* rhsStrides, int* shape, int ndim, int totalSize) + var dm = new DynamicMethod( + name: $"Comparison_SimdFull_{key}", + returnType: typeof(void), + parameterTypes: new[] + { + typeof(void*), typeof(void*), typeof(bool*), + typeof(int*), typeof(int*), typeof(int*), + typeof(int), typeof(int) + }, + owner: typeof(ILKernelGenerator), + skipVisibility: true + ); + + var il = dm.GetILGenerator(); + + int lhsSize = GetTypeSize(key.LhsType); + int rhsSize = GetTypeSize(key.RhsType); + var comparisonType = key.ComparisonType; + + EmitComparisonScalarLoop(il, key, lhsSize, rhsSize, comparisonType); + + il.Emit(OpCodes.Ret); + return dm.CreateDelegate(); + } + + /// + /// Generate a comparison kernel for scalar right operand. + /// + private static ComparisonKernel GenerateComparisonScalarRightKernel(ComparisonKernelKey key) + { + var dm = new DynamicMethod( + name: $"Comparison_ScalarRight_{key}", + returnType: typeof(void), + parameterTypes: new[] + { + typeof(void*), typeof(void*), typeof(bool*), + typeof(int*), typeof(int*), typeof(int*), + typeof(int), typeof(int) + }, + owner: typeof(ILKernelGenerator), + skipVisibility: true + ); + + var il = dm.GetILGenerator(); + + int lhsSize = GetTypeSize(key.LhsType); + int rhsSize = GetTypeSize(key.RhsType); + var comparisonType = key.ComparisonType; + + EmitComparisonScalarRightLoop(il, key, lhsSize, rhsSize, comparisonType); + + il.Emit(OpCodes.Ret); + return dm.CreateDelegate(); + } + + /// + /// Generate a comparison kernel for scalar left operand. + /// + private static ComparisonKernel GenerateComparisonScalarLeftKernel(ComparisonKernelKey key) + { + var dm = new DynamicMethod( + name: $"Comparison_ScalarLeft_{key}", + returnType: typeof(void), + parameterTypes: new[] + { + typeof(void*), typeof(void*), typeof(bool*), + typeof(int*), typeof(int*), typeof(int*), + typeof(int), typeof(int) + }, + owner: typeof(ILKernelGenerator), + skipVisibility: true + ); + + var il = dm.GetILGenerator(); + + int lhsSize = GetTypeSize(key.LhsType); + int rhsSize = GetTypeSize(key.RhsType); + var comparisonType = key.ComparisonType; + + EmitComparisonScalarLeftLoop(il, key, lhsSize, rhsSize, comparisonType); + + il.Emit(OpCodes.Ret); + return dm.CreateDelegate(); + } + + /// + /// Generate a general comparison kernel for arbitrary strides. + /// + private static ComparisonKernel GenerateComparisonGeneralKernel(ComparisonKernelKey key) + { + var dm = new DynamicMethod( + name: $"Comparison_General_{key}", + returnType: typeof(void), + parameterTypes: new[] + { + typeof(void*), typeof(void*), typeof(bool*), + typeof(int*), typeof(int*), typeof(int*), + typeof(int), typeof(int) + }, + owner: typeof(ILKernelGenerator), + skipVisibility: true + ); + + var il = dm.GetILGenerator(); + + int lhsSize = GetTypeSize(key.LhsType); + int rhsSize = GetTypeSize(key.RhsType); + var comparisonType = key.ComparisonType; + + EmitComparisonGeneralLoop(il, key, lhsSize, rhsSize, comparisonType); + + il.Emit(OpCodes.Ret); + return dm.CreateDelegate(); + } + + #region Comparison Loop Emission + + /// + /// Emit a scalar loop for contiguous comparison. + /// + private static void EmitComparisonScalarLoop(ILGenerator il, ComparisonKernelKey key, + int lhsSize, int rhsSize, NPTypeCode comparisonType) + { + // Args: void* lhs (0), void* rhs (1), bool* result (2), + // int* lhsStrides (3), int* rhsStrides (4), int* shape (5), + // int ndim (6), int totalSize (7) + + var locI = il.DeclareLocal(typeof(int)); // loop counter + + var lblLoop = il.DefineLabel(); + var lblLoopEnd = il.DefineLabel(); + + // i = 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locI); + + il.MarkLabel(lblLoop); + + // if (i >= totalSize) goto end + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize + il.Emit(OpCodes.Bge, lblLoopEnd); + + // result[i] = (lhs[i] op rhs[i]) + // Load result address + il.Emit(OpCodes.Ldarg_2); // result (bool*) + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Add); // bool is 1 byte, so just add i + + // Load lhs[i] and convert to comparison type + il.Emit(OpCodes.Ldarg_0); // lhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, lhsSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.LhsType); + EmitConvertTo(il, key.LhsType, comparisonType); + + // Load rhs[i] and convert to comparison type + il.Emit(OpCodes.Ldarg_1); // rhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, rhsSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.RhsType); + EmitConvertTo(il, key.RhsType, comparisonType); + + // Perform comparison + EmitComparisonOperation(il, key.Op, comparisonType); + + // Store bool result + il.Emit(OpCodes.Stind_I1); + + // i++ + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblLoop); + il.MarkLabel(lblLoopEnd); + } + + /// + /// Emit loop for scalar right operand comparison. + /// + private static void EmitComparisonScalarRightLoop(ILGenerator il, ComparisonKernelKey key, + int lhsSize, int rhsSize, NPTypeCode comparisonType) + { + var locI = il.DeclareLocal(typeof(int)); // loop counter + var locRhsVal = il.DeclareLocal(GetClrType(comparisonType)); // scalar value + + var lblLoop = il.DefineLabel(); + var lblLoopEnd = il.DefineLabel(); + + // Load rhs[0] and convert to comparison type, store in local + il.Emit(OpCodes.Ldarg_1); // rhs + EmitLoadIndirect(il, key.RhsType); + EmitConvertTo(il, key.RhsType, comparisonType); + il.Emit(OpCodes.Stloc, locRhsVal); + + // i = 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locI); + + il.MarkLabel(lblLoop); + + // if (i >= totalSize) goto end + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize + il.Emit(OpCodes.Bge, lblLoopEnd); + + // result[i] = (lhs[i] op rhsVal) + il.Emit(OpCodes.Ldarg_2); // result + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Add); + + // Load lhs[i] and convert + il.Emit(OpCodes.Ldarg_0); // lhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, lhsSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.LhsType); + EmitConvertTo(il, key.LhsType, comparisonType); + + // Load cached rhs scalar + il.Emit(OpCodes.Ldloc, locRhsVal); + + EmitComparisonOperation(il, key.Op, comparisonType); + il.Emit(OpCodes.Stind_I1); + + // i++ + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblLoop); + il.MarkLabel(lblLoopEnd); + } + + /// + /// Emit loop for scalar left operand comparison. + /// + private static void EmitComparisonScalarLeftLoop(ILGenerator il, ComparisonKernelKey key, + int lhsSize, int rhsSize, NPTypeCode comparisonType) + { + var locI = il.DeclareLocal(typeof(int)); // loop counter + var locLhsVal = il.DeclareLocal(GetClrType(comparisonType)); // scalar value + + var lblLoop = il.DefineLabel(); + var lblLoopEnd = il.DefineLabel(); + + // Load lhs[0] and convert to comparison type, store in local + il.Emit(OpCodes.Ldarg_0); // lhs + EmitLoadIndirect(il, key.LhsType); + EmitConvertTo(il, key.LhsType, comparisonType); + il.Emit(OpCodes.Stloc, locLhsVal); + + // i = 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locI); + + il.MarkLabel(lblLoop); + + // if (i >= totalSize) goto end + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize + il.Emit(OpCodes.Bge, lblLoopEnd); + + // result[i] = (lhsVal op rhs[i]) + il.Emit(OpCodes.Ldarg_2); // result + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Add); + + // Load cached lhs scalar + il.Emit(OpCodes.Ldloc, locLhsVal); + + // Load rhs[i] and convert + il.Emit(OpCodes.Ldarg_1); // rhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, rhsSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.RhsType); + EmitConvertTo(il, key.RhsType, comparisonType); + + EmitComparisonOperation(il, key.Op, comparisonType); + il.Emit(OpCodes.Stind_I1); + + // i++ + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblLoop); + il.MarkLabel(lblLoopEnd); + } + + /// + /// Emit general coordinate-based iteration loop for comparison. + /// + private static void EmitComparisonGeneralLoop(ILGenerator il, ComparisonKernelKey key, + int lhsSize, int rhsSize, NPTypeCode comparisonType) + { + // Args: void* lhs (0), void* rhs (1), bool* result (2), + // int* lhsStrides (3), int* rhsStrides (4), int* shape (5), + // int ndim (6), int totalSize (7) + + var locI = il.DeclareLocal(typeof(int)); // linear index + var locD = il.DeclareLocal(typeof(int)); // dimension counter + var locLhsOffset = il.DeclareLocal(typeof(int)); // lhs offset + var locRhsOffset = il.DeclareLocal(typeof(int)); // rhs offset + var locCoord = il.DeclareLocal(typeof(int)); // current coordinate + var locIdx = il.DeclareLocal(typeof(int)); // temp for coordinate calculation + + var lblLoop = il.DefineLabel(); + var lblLoopEnd = il.DefineLabel(); + var lblDimLoop = il.DefineLabel(); + var lblDimLoopEnd = il.DefineLabel(); + + // i = 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locI); + + // Main loop + il.MarkLabel(lblLoop); + + // if (i >= totalSize) goto end + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize + il.Emit(OpCodes.Bge, lblLoopEnd); + + // Calculate lhsOffset and rhsOffset from linear index + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locLhsOffset); + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locRhsOffset); + + // idx = i (for coordinate calculation) + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Stloc, locIdx); + + // d = ndim - 1 + il.Emit(OpCodes.Ldarg_S, (byte)6); // ndim + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Sub); + il.Emit(OpCodes.Stloc, locD); + + il.MarkLabel(lblDimLoop); + + // if (d < 0) goto DimLoopEnd + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Blt, lblDimLoopEnd); + + // coord = idx % shape[d] + il.Emit(OpCodes.Ldloc, locIdx); + il.Emit(OpCodes.Ldarg_S, (byte)5); // shape + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4_4); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Ldind_I4); + il.Emit(OpCodes.Rem); + il.Emit(OpCodes.Stloc, locCoord); + + // idx /= shape[d] + il.Emit(OpCodes.Ldloc, locIdx); + il.Emit(OpCodes.Ldarg_S, (byte)5); // shape + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4_4); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Ldind_I4); + il.Emit(OpCodes.Div); + il.Emit(OpCodes.Stloc, locIdx); + + // lhsOffset += coord * lhsStrides[d] + il.Emit(OpCodes.Ldloc, locLhsOffset); + il.Emit(OpCodes.Ldloc, locCoord); + il.Emit(OpCodes.Ldarg_3); // lhsStrides + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4_4); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Ldind_I4); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locLhsOffset); + + // rhsOffset += coord * rhsStrides[d] + il.Emit(OpCodes.Ldloc, locRhsOffset); + il.Emit(OpCodes.Ldloc, locCoord); + il.Emit(OpCodes.Ldarg_S, (byte)4); // rhsStrides + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4_4); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Ldind_I4); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locRhsOffset); + + // d-- + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Sub); + il.Emit(OpCodes.Stloc, locD); + + il.Emit(OpCodes.Br, lblDimLoop); + il.MarkLabel(lblDimLoopEnd); + + // result[i] = (lhs[lhsOffset] op rhs[rhsOffset]) + // Load result address (contiguous output) + il.Emit(OpCodes.Ldarg_2); // result + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Add); + + // Load lhs[lhsOffset] + il.Emit(OpCodes.Ldarg_0); // lhs + il.Emit(OpCodes.Ldloc, locLhsOffset); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, lhsSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.LhsType); + EmitConvertTo(il, key.LhsType, comparisonType); + + // Load rhs[rhsOffset] + il.Emit(OpCodes.Ldarg_1); // rhs + il.Emit(OpCodes.Ldloc, locRhsOffset); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, rhsSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.RhsType); + EmitConvertTo(il, key.RhsType, comparisonType); + + // Comparison + EmitComparisonOperation(il, key.Op, comparisonType); + + // Store bool + il.Emit(OpCodes.Stind_I1); + + // i++ + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblLoop); + il.MarkLabel(lblLoopEnd); + } + + #endregion + + #region Comparison Operation Emission + + /// + /// Emit comparison operation. Stack has two values of comparisonType, result is bool (0 or 1). + /// + internal static void EmitComparisonOperation(ILGenerator il, ComparisonOp op, NPTypeCode comparisonType) + { + // Special handling for decimal comparisons + if (comparisonType == NPTypeCode.Decimal) + { + EmitDecimalComparison(il, op); + return; + } + + bool isUnsigned = IsUnsigned(comparisonType); + bool isFloat = comparisonType == NPTypeCode.Single || comparisonType == NPTypeCode.Double; + + switch (op) + { + case ComparisonOp.Equal: + il.Emit(OpCodes.Ceq); + break; + + case ComparisonOp.NotEqual: + il.Emit(OpCodes.Ceq); + // Negate: result = !result (xor with 1) + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Ceq); + break; + + case ComparisonOp.Less: + if (isUnsigned) + il.Emit(OpCodes.Clt_Un); + else + il.Emit(OpCodes.Clt); + break; + + case ComparisonOp.LessEqual: + // a <= b is !(a > b) + if (isUnsigned) + il.Emit(OpCodes.Cgt_Un); + else + il.Emit(OpCodes.Cgt); + // Negate + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Ceq); + break; + + case ComparisonOp.Greater: + if (isUnsigned) + il.Emit(OpCodes.Cgt_Un); + else + il.Emit(OpCodes.Cgt); + break; + + case ComparisonOp.GreaterEqual: + // a >= b is !(a < b) + if (isUnsigned) + il.Emit(OpCodes.Clt_Un); + else + il.Emit(OpCodes.Clt); + // Negate + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Ceq); + break; + + default: + throw new NotSupportedException($"Comparison operation {op} not supported"); + } + } + + /// + /// Emit decimal comparison using operator methods. + /// + private static void EmitDecimalComparison(ILGenerator il, ComparisonOp op) + { + // decimal has comparison operators that return bool + string methodName = op switch + { + ComparisonOp.Equal => "op_Equality", + ComparisonOp.NotEqual => "op_Inequality", + ComparisonOp.Less => "op_LessThan", + ComparisonOp.LessEqual => "op_LessThanOrEqual", + ComparisonOp.Greater => "op_GreaterThan", + ComparisonOp.GreaterEqual => "op_GreaterThanOrEqual", + _ => throw new NotSupportedException($"Comparison {op} not supported for decimal") + }; + + var method = typeof(decimal).GetMethod( + methodName, + BindingFlags.Public | BindingFlags.Static, + null, + new[] { typeof(decimal), typeof(decimal) }, + null + ); + + il.EmitCall(OpCodes.Call, method!, null); + } + + #endregion + + #region Comparison Scalar Kernel Generation + + /// + /// Cache key for comparison scalar operation kernels. + /// + public readonly record struct ComparisonScalarKernelKey( + NPTypeCode LhsType, + NPTypeCode RhsType, + ComparisonOp Op + ) + { + public NPTypeCode ComparisonType => np._FindCommonScalarType(LhsType, RhsType); + public override string ToString() => $"ScalarCmp_{Op}_{LhsType}_{RhsType}"; + } + + /// + /// Cache for comparison scalar kernels. + /// + private static readonly ConcurrentDictionary _comparisonScalarCache = new(); + + /// + /// Number of comparison scalar kernels in cache. + /// + public static int ComparisonScalarCachedCount => _comparisonScalarCache.Count; + + /// + /// Get or generate a comparison scalar delegate. + /// Returns a Func<TLhs, TRhs, bool> delegate. + /// + public static Delegate GetComparisonScalarDelegate(ComparisonScalarKernelKey key) + { + if (!Enabled) + throw new InvalidOperationException("IL generation is disabled"); + + return _comparisonScalarCache.GetOrAdd(key, GenerateComparisonScalarDelegate); + } + + /// + /// Generate an IL-based comparison scalar delegate. + /// + private static Delegate GenerateComparisonScalarDelegate(ComparisonScalarKernelKey key) + { + var lhsClr = GetClrType(key.LhsType); + var rhsClr = GetClrType(key.RhsType); + var comparisonType = key.ComparisonType; + + // Create DynamicMethod: bool Method(TLhs lhs, TRhs rhs) + var dm = new DynamicMethod( + name: $"ScalarComparison_{key}", + returnType: typeof(bool), + parameterTypes: new[] { lhsClr, rhsClr }, + owner: typeof(ILKernelGenerator), + skipVisibility: true + ); + + var il = dm.GetILGenerator(); + + // Load lhs, convert to comparison type + il.Emit(OpCodes.Ldarg_0); + EmitConvertTo(il, key.LhsType, comparisonType); + + // Load rhs, convert to comparison type + il.Emit(OpCodes.Ldarg_1); + EmitConvertTo(il, key.RhsType, comparisonType); + + // Perform comparison + EmitComparisonOperation(il, key.Op, comparisonType); + + // Return + il.Emit(OpCodes.Ret); + + // Create typed Func + var funcType = typeof(Func<,,>).MakeGenericType(lhsClr, rhsClr, typeof(bool)); + return dm.CreateDelegate(funcType); + } + + #endregion + + #endregion + + #region Reduction Kernel Generation + + /// + /// Cache for element-wise reduction kernels. + /// Key: ElementReductionKernelKey + /// + private static readonly ConcurrentDictionary _elementReductionCache = new(); + + /// + /// Number of element reduction kernels in cache. + /// + public static int ElementReductionCachedCount => _elementReductionCache.Count; + + /// + /// Clear the reduction kernel caches. + /// + public static void ClearReduction() + { + _elementReductionCache.Clear(); + } + + /// + /// Get or generate a typed element-wise reduction kernel. + /// Returns a delegate that reduces all elements to a single value of type TResult. + /// + public static TypedElementReductionKernel GetTypedElementReductionKernel(ElementReductionKernelKey key) + where TResult : unmanaged + { + if (!Enabled) + throw new InvalidOperationException("IL generation is disabled"); + + var kernel = _elementReductionCache.GetOrAdd(key, GenerateTypedElementReductionKernel); + return (TypedElementReductionKernel)kernel; + } + + /// + /// Try to get or generate an element reduction kernel. + /// + public static TypedElementReductionKernel? TryGetTypedElementReductionKernel(ElementReductionKernelKey key) + where TResult : unmanaged + { + if (!Enabled) + return null; + + try + { + var kernel = _elementReductionCache.GetOrAdd(key, GenerateTypedElementReductionKernel); + return (TypedElementReductionKernel)kernel; + } + catch + { + return null; + } + } + + /// + /// Generate a typed element-wise reduction kernel. + /// + private static Delegate GenerateTypedElementReductionKernel(ElementReductionKernelKey key) + where TResult : unmanaged + { + // TypedElementReductionKernel signature: + // TResult(void* input, int* strides, int* shape, int ndim, int totalSize) + var dm = new DynamicMethod( + name: $"ElemReduce_{key}", + returnType: typeof(TResult), + parameterTypes: new[] + { + typeof(void*), typeof(int*), typeof(int*), typeof(int), typeof(int) + }, + owner: typeof(ILKernelGenerator), + skipVisibility: true + ); + + var il = dm.GetILGenerator(); + + int inputSize = GetTypeSize(key.InputType); + int accumSize = GetTypeSize(key.AccumulatorType); + + if (key.IsContiguous) + { + // Check if we can use SIMD + bool canSimd = CanUseReductionSimd(key); + if (canSimd) + { + EmitReductionSimdLoop(il, key, inputSize); + } + else + { + EmitReductionScalarLoop(il, key, inputSize); + } + } + else + { + EmitReductionStridedLoop(il, key, inputSize); + } + + il.Emit(OpCodes.Ret); + return dm.CreateDelegate>(); + } + + /// + /// Check if SIMD can be used for this reduction operation. + /// + private static bool CanUseReductionSimd(ElementReductionKernelKey key) + { + // Must be contiguous + if (!key.IsContiguous) + return false; + + // SIMD for numeric types (not bool, char, decimal) + if (!CanUseSimd(key.InputType)) + return false; + + // Only certain operations have SIMD support + // Sum: Vector256.Sum() or manual horizontal add + // Max/Min: Reduce vector then scalar reduce remainder + // Prod: No SIMD (no horizontal multiply) + // ArgMax/ArgMin: Need to track indices, more complex + return key.Op == ReductionOp.Sum || key.Op == ReductionOp.Max || key.Op == ReductionOp.Min; + } + + /// + /// Emit a SIMD reduction loop for contiguous arrays. + /// Uses Vector256 for horizontal reductions. + /// + private static void EmitReductionSimdLoop(ILGenerator il, ElementReductionKernelKey key, int inputSize) + { + int vectorCount = GetVectorCount(key.InputType); + + var locI = il.DeclareLocal(typeof(int)); // loop counter + var locVectorEnd = il.DeclareLocal(typeof(int)); // totalSize - vectorCount + var locAccum = il.DeclareLocal(GetClrType(key.AccumulatorType)); // scalar accumulator + + var lblSimdLoop = il.DefineLabel(); + var lblSimdLoopEnd = il.DefineLabel(); + var lblTailLoop = il.DefineLabel(); + var lblTailLoopEnd = il.DefineLabel(); + + // Initialize accumulator with identity value + EmitLoadIdentity(il, key.Op, key.AccumulatorType); + il.Emit(OpCodes.Stloc, locAccum); + + // vectorEnd = totalSize - vectorCount + il.Emit(OpCodes.Ldarg_S, (byte)4); // totalSize + il.Emit(OpCodes.Ldc_I4, vectorCount); + il.Emit(OpCodes.Sub); + il.Emit(OpCodes.Stloc, locVectorEnd); + + // i = 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locI); + + // === SIMD LOOP === + il.MarkLabel(lblSimdLoop); + + // if (i > vectorEnd) goto SimdLoopEnd + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldloc, locVectorEnd); + il.Emit(OpCodes.Bgt, lblSimdLoopEnd); + + // Load vector from input[i] + il.Emit(OpCodes.Ldarg_0); // input + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, inputSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitVectorLoad(il, key.InputType); + + // Perform horizontal reduction on vector and combine with accumulator + EmitVectorHorizontalReduction(il, key.Op, key.InputType); + + // Combine with accumulator + il.Emit(OpCodes.Ldloc, locAccum); + EmitReductionCombine(il, key.Op, key.AccumulatorType); + il.Emit(OpCodes.Stloc, locAccum); + + // i += vectorCount + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4, vectorCount); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblSimdLoop); + il.MarkLabel(lblSimdLoopEnd); + + // === TAIL LOOP === + il.MarkLabel(lblTailLoop); + + // if (i >= totalSize) goto end + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldarg_S, (byte)4); // totalSize + il.Emit(OpCodes.Bge, lblTailLoopEnd); + + // Load input[i], convert to accumulator type + il.Emit(OpCodes.Ldarg_0); // input + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, inputSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.InputType); + EmitConvertTo(il, key.InputType, key.AccumulatorType); + + // Combine with accumulator + il.Emit(OpCodes.Ldloc, locAccum); + EmitReductionCombine(il, key.Op, key.AccumulatorType); + il.Emit(OpCodes.Stloc, locAccum); + + // i++ + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblTailLoop); + il.MarkLabel(lblTailLoopEnd); + + // Return accumulator + il.Emit(OpCodes.Ldloc, locAccum); + } + + /// + /// Emit a scalar reduction loop for contiguous arrays (no SIMD). + /// + private static void EmitReductionScalarLoop(ILGenerator il, ElementReductionKernelKey key, int inputSize) + { + // Args: void* input (0), int* strides (1), int* shape (2), int ndim (3), int totalSize (4) + + var locI = il.DeclareLocal(typeof(int)); // loop counter + var locAccum = il.DeclareLocal(GetClrType(key.AccumulatorType)); // accumulator + var locIdx = il.DeclareLocal(typeof(int)); // index for ArgMax/ArgMin + + var lblLoop = il.DefineLabel(); + var lblLoopEnd = il.DefineLabel(); + + // Initialize accumulator with identity value + EmitLoadIdentity(il, key.Op, key.AccumulatorType); + il.Emit(OpCodes.Stloc, locAccum); + + // For ArgMax/ArgMin, initialize index to 0 + if (key.Op == ReductionOp.ArgMax || key.Op == ReductionOp.ArgMin) + { + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locIdx); + } + + // i = 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locI); + + il.MarkLabel(lblLoop); + + // if (i >= totalSize) goto end + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldarg_S, (byte)4); // totalSize + il.Emit(OpCodes.Bge, lblLoopEnd); + + // Load input[i], convert to accumulator type + il.Emit(OpCodes.Ldarg_0); // input + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, inputSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.InputType); + EmitConvertTo(il, key.InputType, key.AccumulatorType); + + // Combine with accumulator (and track index for ArgMax/ArgMin) + if (key.Op == ReductionOp.ArgMax || key.Op == ReductionOp.ArgMin) + { + EmitArgReductionStep(il, key.Op, key.AccumulatorType, locAccum, locIdx, locI); + } + else + { + il.Emit(OpCodes.Ldloc, locAccum); + EmitReductionCombine(il, key.Op, key.AccumulatorType); + il.Emit(OpCodes.Stloc, locAccum); + } + + // i++ + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblLoop); + il.MarkLabel(lblLoopEnd); + + // Return accumulator or index + if (key.Op == ReductionOp.ArgMax || key.Op == ReductionOp.ArgMin) + { + il.Emit(OpCodes.Ldloc, locIdx); + } + else + { + il.Emit(OpCodes.Ldloc, locAccum); + } + } + + /// + /// Emit a strided reduction loop for non-contiguous arrays. + /// + private static void EmitReductionStridedLoop(ILGenerator il, ElementReductionKernelKey key, int inputSize) + { + // Args: void* input (0), int* strides (1), int* shape (2), int ndim (3), int totalSize (4) + + var locI = il.DeclareLocal(typeof(int)); // linear index + var locD = il.DeclareLocal(typeof(int)); // dimension counter + var locOffset = il.DeclareLocal(typeof(int)); // input offset + var locCoord = il.DeclareLocal(typeof(int)); // current coordinate + var locIdx = il.DeclareLocal(typeof(int)); // temp for coordinate calculation + var locAccum = il.DeclareLocal(GetClrType(key.AccumulatorType)); // accumulator + var locArgIdx = il.DeclareLocal(typeof(int)); // index for ArgMax/ArgMin + + var lblLoop = il.DefineLabel(); + var lblLoopEnd = il.DefineLabel(); + var lblDimLoop = il.DefineLabel(); + var lblDimLoopEnd = il.DefineLabel(); + + // Initialize accumulator + EmitLoadIdentity(il, key.Op, key.AccumulatorType); + il.Emit(OpCodes.Stloc, locAccum); + + // For ArgMax/ArgMin, initialize index to 0 + if (key.Op == ReductionOp.ArgMax || key.Op == ReductionOp.ArgMin) + { + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locArgIdx); + } + + // i = 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locI); + + // Main loop + il.MarkLabel(lblLoop); + + // if (i >= totalSize) goto end + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldarg_S, (byte)4); // totalSize + il.Emit(OpCodes.Bge, lblLoopEnd); + + // Calculate offset from linear index + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locOffset); + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Stloc, locIdx); + + // d = ndim - 1 + il.Emit(OpCodes.Ldarg_3); // ndim + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Sub); + il.Emit(OpCodes.Stloc, locD); + + il.MarkLabel(lblDimLoop); + + // if (d < 0) goto DimLoopEnd + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Blt, lblDimLoopEnd); + + // coord = idx % shape[d] + il.Emit(OpCodes.Ldloc, locIdx); + il.Emit(OpCodes.Ldarg_2); // shape + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4_4); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Ldind_I4); + il.Emit(OpCodes.Rem); + il.Emit(OpCodes.Stloc, locCoord); + + // idx /= shape[d] + il.Emit(OpCodes.Ldloc, locIdx); + il.Emit(OpCodes.Ldarg_2); // shape + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4_4); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Ldind_I4); + il.Emit(OpCodes.Div); + il.Emit(OpCodes.Stloc, locIdx); + + // offset += coord * strides[d] + il.Emit(OpCodes.Ldloc, locOffset); + il.Emit(OpCodes.Ldloc, locCoord); + il.Emit(OpCodes.Ldarg_1); // strides + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4_4); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Ldind_I4); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locOffset); + + // d-- + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Sub); + il.Emit(OpCodes.Stloc, locD); + + il.Emit(OpCodes.Br, lblDimLoop); + il.MarkLabel(lblDimLoopEnd); + + // Load input[offset] + il.Emit(OpCodes.Ldarg_0); // input + il.Emit(OpCodes.Ldloc, locOffset); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, inputSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.InputType); + EmitConvertTo(il, key.InputType, key.AccumulatorType); + + // Combine with accumulator + if (key.Op == ReductionOp.ArgMax || key.Op == ReductionOp.ArgMin) + { + EmitArgReductionStep(il, key.Op, key.AccumulatorType, locAccum, locArgIdx, locI); + } + else + { + il.Emit(OpCodes.Ldloc, locAccum); + EmitReductionCombine(il, key.Op, key.AccumulatorType); + il.Emit(OpCodes.Stloc, locAccum); + } + + // i++ + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblLoop); + il.MarkLabel(lblLoopEnd); + + // Return accumulator or index + if (key.Op == ReductionOp.ArgMax || key.Op == ReductionOp.ArgMin) + { + il.Emit(OpCodes.Ldloc, locArgIdx); + } + else + { + il.Emit(OpCodes.Ldloc, locAccum); + } + } + + #region Reduction IL Helpers + + /// + /// Load the identity value for a reduction operation. + /// + private static void EmitLoadIdentity(ILGenerator il, ReductionOp op, NPTypeCode type) + { + switch (op) + { + case ReductionOp.Sum: + case ReductionOp.Mean: + case ReductionOp.CumSum: + // Identity is 0 + EmitLoadZero(il, type); + break; + + case ReductionOp.Prod: + // Identity is 1 + EmitLoadOne(il, type); + break; + + case ReductionOp.Max: + // Identity is minimum value (so first element becomes max) + EmitLoadMinValue(il, type); + break; + + case ReductionOp.Min: + // Identity is maximum value (so first element becomes min) + EmitLoadMaxValue(il, type); + break; + + case ReductionOp.ArgMax: + case ReductionOp.ArgMin: + // For ArgMax/ArgMin, accumulator holds current best value + // Initialize with first element value (handled separately) + if (op == ReductionOp.ArgMax) + EmitLoadMinValue(il, type); + else + EmitLoadMaxValue(il, type); + break; + + default: + throw new NotSupportedException($"Identity for {op} not supported"); + } + } + + /// + /// Load zero for a type. + /// + private static void EmitLoadZero(ILGenerator il, NPTypeCode type) + { + switch (type) + { + case NPTypeCode.Boolean: + case NPTypeCode.Byte: + case NPTypeCode.Int16: + case NPTypeCode.UInt16: + case NPTypeCode.Char: + case NPTypeCode.Int32: + case NPTypeCode.UInt32: + il.Emit(OpCodes.Ldc_I4_0); + break; + case NPTypeCode.Int64: + case NPTypeCode.UInt64: + il.Emit(OpCodes.Ldc_I8, 0L); + break; + case NPTypeCode.Single: + il.Emit(OpCodes.Ldc_R4, 0f); + break; + case NPTypeCode.Double: + il.Emit(OpCodes.Ldc_R8, 0d); + break; + case NPTypeCode.Decimal: + il.Emit(OpCodes.Ldsfld, typeof(decimal).GetField("Zero")!); + break; + default: + throw new NotSupportedException($"Type {type} not supported"); + } + } + + /// + /// Load one for a type. + /// + private static void EmitLoadOne(ILGenerator il, NPTypeCode type) + { + switch (type) + { + case NPTypeCode.Boolean: + case NPTypeCode.Byte: + case NPTypeCode.Int16: + case NPTypeCode.UInt16: + case NPTypeCode.Char: + case NPTypeCode.Int32: + case NPTypeCode.UInt32: + il.Emit(OpCodes.Ldc_I4_1); + break; + case NPTypeCode.Int64: + case NPTypeCode.UInt64: + il.Emit(OpCodes.Ldc_I8, 1L); + break; + case NPTypeCode.Single: + il.Emit(OpCodes.Ldc_R4, 1f); + break; + case NPTypeCode.Double: + il.Emit(OpCodes.Ldc_R8, 1d); + break; + case NPTypeCode.Decimal: + il.Emit(OpCodes.Ldsfld, typeof(decimal).GetField("One")!); + break; + default: + throw new NotSupportedException($"Type {type} not supported"); + } + } + + /// + /// Load minimum value for a type. + /// + private static void EmitLoadMinValue(ILGenerator il, NPTypeCode type) + { + switch (type) + { + case NPTypeCode.Byte: + il.Emit(OpCodes.Ldc_I4, (int)byte.MinValue); + break; + case NPTypeCode.Int16: + il.Emit(OpCodes.Ldc_I4, (int)short.MinValue); + break; + case NPTypeCode.UInt16: + case NPTypeCode.Char: + il.Emit(OpCodes.Ldc_I4, (int)ushort.MinValue); + break; + case NPTypeCode.Int32: + il.Emit(OpCodes.Ldc_I4, int.MinValue); + break; + case NPTypeCode.UInt32: + il.Emit(OpCodes.Ldc_I4, unchecked((int)uint.MinValue)); + break; + case NPTypeCode.Int64: + il.Emit(OpCodes.Ldc_I8, long.MinValue); + break; + case NPTypeCode.UInt64: + il.Emit(OpCodes.Ldc_I8, unchecked((long)ulong.MinValue)); + break; + case NPTypeCode.Single: + il.Emit(OpCodes.Ldc_R4, float.NegativeInfinity); + break; + case NPTypeCode.Double: + il.Emit(OpCodes.Ldc_R8, double.NegativeInfinity); + break; + case NPTypeCode.Decimal: + il.Emit(OpCodes.Ldsfld, typeof(decimal).GetField("MinValue")!); + break; + default: + throw new NotSupportedException($"Type {type} not supported"); + } + } + + /// + /// Load maximum value for a type. + /// + private static void EmitLoadMaxValue(ILGenerator il, NPTypeCode type) + { + switch (type) + { + case NPTypeCode.Byte: + il.Emit(OpCodes.Ldc_I4, (int)byte.MaxValue); + break; + case NPTypeCode.Int16: + il.Emit(OpCodes.Ldc_I4, (int)short.MaxValue); + break; + case NPTypeCode.UInt16: + case NPTypeCode.Char: + il.Emit(OpCodes.Ldc_I4, (int)ushort.MaxValue); + break; + case NPTypeCode.Int32: + il.Emit(OpCodes.Ldc_I4, int.MaxValue); + break; + case NPTypeCode.UInt32: + il.Emit(OpCodes.Ldc_I4, unchecked((int)uint.MaxValue)); + break; + case NPTypeCode.Int64: + il.Emit(OpCodes.Ldc_I8, long.MaxValue); + break; + case NPTypeCode.UInt64: + il.Emit(OpCodes.Ldc_I8, unchecked((long)ulong.MaxValue)); + break; + case NPTypeCode.Single: + il.Emit(OpCodes.Ldc_R4, float.PositiveInfinity); + break; + case NPTypeCode.Double: + il.Emit(OpCodes.Ldc_R8, double.PositiveInfinity); + break; + case NPTypeCode.Decimal: + il.Emit(OpCodes.Ldsfld, typeof(decimal).GetField("MaxValue")!); + break; + default: + throw new NotSupportedException($"Type {type} not supported"); + } + } + + /// + /// Emit horizontal reduction of a Vector256. + /// Stack has Vector256, result is scalar reduction. + /// + private static void EmitVectorHorizontalReduction(ILGenerator il, ReductionOp op, NPTypeCode type) + { + var clrType = GetClrType(type); + var vectorType = typeof(Vector256<>).MakeGenericType(clrType); + + switch (op) + { + case ReductionOp.Sum: + // Use Vector256.Sum() + var sumMethod = typeof(Vector256).GetMethods(BindingFlags.Public | BindingFlags.Static) + .Where(m => m.Name == "Sum" && m.IsGenericMethod && m.GetParameters().Length == 1) + .Select(m => m.MakeGenericMethod(clrType)) + .FirstOrDefault(m => m.GetParameters()[0].ParameterType == vectorType); + + if (sumMethod != null) + { + il.EmitCall(OpCodes.Call, sumMethod, null); + } + else + { + // Fallback: manual horizontal add using GetElement + EmitManualHorizontalSum(il, type); + } + break; + + case ReductionOp.Max: + case ReductionOp.Min: + // No built-in horizontal max/min, need to reduce manually + EmitManualHorizontalMinMax(il, op, type); + break; + + default: + throw new NotSupportedException($"SIMD horizontal reduction for {op} not supported"); + } + } + + /// + /// Emit manual horizontal sum using GetElement. + /// + private static void EmitManualHorizontalSum(ILGenerator il, NPTypeCode type) + { + var clrType = GetClrType(type); + var vectorType = typeof(Vector256<>).MakeGenericType(clrType); + int count = GetVectorCount(type); + + // Store vector in local + var locVec = il.DeclareLocal(vectorType); + il.Emit(OpCodes.Stloc, locVec); + + // Load first element + il.Emit(OpCodes.Ldloc, locVec); + il.Emit(OpCodes.Ldc_I4_0); + var getElementMethod = typeof(Vector256).GetMethods(BindingFlags.Public | BindingFlags.Static) + .Where(m => m.Name == "GetElement" && m.IsGenericMethod) + .Select(m => m.MakeGenericMethod(clrType)) + .First(); + il.EmitCall(OpCodes.Call, getElementMethod, null); + + // Add remaining elements + for (int i = 1; i < count; i++) + { + il.Emit(OpCodes.Ldloc, locVec); + il.Emit(OpCodes.Ldc_I4, i); + il.EmitCall(OpCodes.Call, getElementMethod, null); + il.Emit(OpCodes.Add); + } + } + + /// + /// Emit manual horizontal min/max using GetElement. + /// + private static void EmitManualHorizontalMinMax(ILGenerator il, ReductionOp op, NPTypeCode type) + { + var clrType = GetClrType(type); + var vectorType = typeof(Vector256<>).MakeGenericType(clrType); + int count = GetVectorCount(type); + + // Store vector in local + var locVec = il.DeclareLocal(vectorType); + il.Emit(OpCodes.Stloc, locVec); + + // Load first element as initial accumulator + il.Emit(OpCodes.Ldloc, locVec); + il.Emit(OpCodes.Ldc_I4_0); + var getElementMethod = typeof(Vector256).GetMethods(BindingFlags.Public | BindingFlags.Static) + .Where(m => m.Name == "GetElement" && m.IsGenericMethod) + .Select(m => m.MakeGenericMethod(clrType)) + .First(); + il.EmitCall(OpCodes.Call, getElementMethod, null); + + // Compare with remaining elements using Math.Max/Math.Min + var mathMethod = GetMathMinMaxMethod(op, clrType); + + for (int i = 1; i < count; i++) + { + il.Emit(OpCodes.Ldloc, locVec); + il.Emit(OpCodes.Ldc_I4, i); + il.EmitCall(OpCodes.Call, getElementMethod, null); + + if (mathMethod != null) + { + il.EmitCall(OpCodes.Call, mathMethod, null); + } + else + { + // Fallback for types without Math.Max/Min (use comparison) + EmitScalarMinMax(il, op, type); + } + } + } + + /// + /// Get the Math.Max or Math.Min method for a type. + /// + private static MethodInfo? GetMathMinMaxMethod(ReductionOp op, Type clrType) + { + string name = op == ReductionOp.Max ? "Max" : "Min"; + return typeof(Math).GetMethod(name, new[] { clrType, clrType }); + } + + /// + /// Emit scalar min/max comparison. + /// Stack has [value1, value2], result is min or max. + /// + private static void EmitScalarMinMax(ILGenerator il, ReductionOp op, NPTypeCode type) + { + // Use comparison: (a > b) ? a : b for Max, (a < b) ? a : b for Min + var locA = il.DeclareLocal(GetClrType(type)); + var locB = il.DeclareLocal(GetClrType(type)); + var lblFalse = il.DefineLabel(); + var lblEnd = il.DefineLabel(); + + il.Emit(OpCodes.Stloc, locB); + il.Emit(OpCodes.Stloc, locA); + + il.Emit(OpCodes.Ldloc, locA); + il.Emit(OpCodes.Ldloc, locB); + + if (op == ReductionOp.Max) + { + if (IsUnsigned(type)) + il.Emit(OpCodes.Bgt_Un, lblFalse); + else + il.Emit(OpCodes.Bgt, lblFalse); + + // a <= b, return b + il.Emit(OpCodes.Ldloc, locB); + il.Emit(OpCodes.Br, lblEnd); + + il.MarkLabel(lblFalse); + // a > b, return a + il.Emit(OpCodes.Ldloc, locA); + } + else + { + if (IsUnsigned(type)) + il.Emit(OpCodes.Blt_Un, lblFalse); + else + il.Emit(OpCodes.Blt, lblFalse); + + // a >= b, return b + il.Emit(OpCodes.Ldloc, locB); + il.Emit(OpCodes.Br, lblEnd); + + il.MarkLabel(lblFalse); + // a < b, return a + il.Emit(OpCodes.Ldloc, locA); + } + + il.MarkLabel(lblEnd); + } + + /// + /// Emit reduction combine operation. + /// Stack has [newValue, accumulator], result is combined value. + /// + private static void EmitReductionCombine(ILGenerator il, ReductionOp op, NPTypeCode type) + { + switch (op) + { + case ReductionOp.Sum: + case ReductionOp.Mean: + case ReductionOp.CumSum: + // Add + if (type == NPTypeCode.Decimal) + { + il.EmitCall(OpCodes.Call, typeof(decimal).GetMethod("op_Addition", new[] { typeof(decimal), typeof(decimal) })!, null); + } + else + { + il.Emit(OpCodes.Add); + } + break; + + case ReductionOp.Prod: + // Multiply + if (type == NPTypeCode.Decimal) + { + il.EmitCall(OpCodes.Call, typeof(decimal).GetMethod("op_Multiply", new[] { typeof(decimal), typeof(decimal) })!, null); + } + else + { + il.Emit(OpCodes.Mul); + } + break; + + case ReductionOp.Max: + { + var clrType = GetClrType(type); + var mathMethod = GetMathMinMaxMethod(op, clrType); + if (mathMethod != null) + { + il.EmitCall(OpCodes.Call, mathMethod, null); + } + else + { + EmitScalarMinMax(il, op, type); + } + } + break; + + case ReductionOp.Min: + { + var clrType = GetClrType(type); + var mathMethod = GetMathMinMaxMethod(op, clrType); + if (mathMethod != null) + { + il.EmitCall(OpCodes.Call, mathMethod, null); + } + else + { + EmitScalarMinMax(il, op, type); + } + } + break; + + default: + throw new NotSupportedException($"Reduction combine for {op} not supported"); + } + } + + /// + /// Emit ArgMax/ArgMin step - compare new value with accumulator, update index if better. + /// Stack has [newValue]. Updates locAccum and locIdx. + /// + private static void EmitArgReductionStep(ILGenerator il, ReductionOp op, NPTypeCode type, + LocalBuilder locAccum, LocalBuilder locIdx, LocalBuilder locI) + { + // newValue is on stack, compare with locAccum + var lblSkip = il.DefineLabel(); + + il.Emit(OpCodes.Dup); // [newValue, newValue] + il.Emit(OpCodes.Ldloc, locAccum); // [newValue, newValue, accum] + + // Compare: newValue > accum (for ArgMax) or newValue < accum (for ArgMin) + if (op == ReductionOp.ArgMax) + { + if (IsUnsigned(type)) + il.Emit(OpCodes.Ble_Un, lblSkip); + else + il.Emit(OpCodes.Ble, lblSkip); + } + else // ArgMin + { + if (IsUnsigned(type)) + il.Emit(OpCodes.Bge_Un, lblSkip); + else + il.Emit(OpCodes.Bge, lblSkip); + } + + // Update: newValue is better + // Stack has [newValue] + il.Emit(OpCodes.Stloc, locAccum); // accum = newValue + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Stloc, locIdx); // idx = i + var lblEnd = il.DefineLabel(); + il.Emit(OpCodes.Br, lblEnd); + + il.MarkLabel(lblSkip); + // Not better, pop newValue + il.Emit(OpCodes.Pop); + + il.MarkLabel(lblEnd); + } + + #endregion + + #endregion + } +} diff --git a/src/NumSharp.Core/Backends/Kernels/KernelCache.cs b/src/NumSharp.Core/Backends/Kernels/KernelCache.cs new file mode 100644 index 00000000..9b7ac5d3 --- /dev/null +++ b/src/NumSharp.Core/Backends/Kernels/KernelCache.cs @@ -0,0 +1,173 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; + +namespace NumSharp.Backends.Kernels +{ + /// + /// Cache of compiled binary operation kernels. + /// Provides thread-safe access to kernels keyed by (Operation, NPTypeCode). + /// + /// Supports two kernel generation modes: + /// - C# reference implementations (SimdKernels.cs) - always available + /// - IL-generated kernels (ILKernelGenerator.cs) - ~10-15% faster for contiguous arrays + /// + public static class KernelCache + { + /// + /// Cache of kernel delegates. + /// + private static readonly ConcurrentDictionary<(BinaryOp, NPTypeCode), Delegate> _cache = new(); + + /// + /// Whether to prefer IL-generated kernels over C# implementations. + /// Default is true. Set to false for debugging or benchmarking. + /// + public static bool PreferILGeneration { get; set; } = true; + + /// + /// Get a typed kernel for the specified operation and type. + /// Uses IL-generated kernels when available and enabled. + /// + public static BinaryKernel Get(BinaryOp op) where T : unmanaged + { + var key = (op, GetTypeCode()); + + if (_cache.TryGetValue(key, out var cached)) + { + return (BinaryKernel)cached; + } + + // Try IL generation first if enabled + BinaryKernel? kernel = null; + if (PreferILGeneration && ILKernelGenerator.Enabled) + { + kernel = ILKernelGenerator.GenerateUnifiedKernel(op); + } + + // Fall back to C# implementations + kernel ??= CreateCSharpKernel(op); + + _cache.TryAdd(key, kernel); + return kernel; + } + + /// + /// Get kernel with runtime type dispatch. + /// Used by DefaultEngine for integration. + /// + public static Delegate Get(BinaryOp op, NPTypeCode dtype) + { + return dtype switch + { + NPTypeCode.Byte => Get(op), + NPTypeCode.Int16 => Get(op), + NPTypeCode.UInt16 => Get(op), + NPTypeCode.Int32 => Get(op), + NPTypeCode.UInt32 => Get(op), + NPTypeCode.Int64 => Get(op), + NPTypeCode.UInt64 => Get(op), + NPTypeCode.Single => Get(op), + NPTypeCode.Double => Get(op), + _ => throw new NotSupportedException($"SIMD kernels not supported for {dtype}") + }; + } + + /// + /// Create a C# reference implementation kernel for the specified operation and type. + /// + private static unsafe BinaryKernel CreateCSharpKernel(BinaryOp op) where T : unmanaged + { + // Return the appropriate C# implementation + // Add operation + if (op == BinaryOp.Add) + { + if (typeof(T) == typeof(int)) + return (BinaryKernel)(Delegate)(BinaryKernel)SimdKernels.Add_Int32; + if (typeof(T) == typeof(double)) + return (BinaryKernel)(Delegate)(BinaryKernel)SimdKernels.Add_Double; + if (typeof(T) == typeof(float)) + return (BinaryKernel)(Delegate)(BinaryKernel)SimdKernels.Add_Single; + if (typeof(T) == typeof(long)) + return (BinaryKernel)(Delegate)(BinaryKernel)SimdKernels.Add_Int64; + } + + // TODO: Add Subtract, Multiply, Divide kernels + + throw new NotImplementedException($"C# kernel for {op} on {typeof(T).Name} not yet implemented"); + } + + /// + /// Pre-compile all kernels at startup. + /// Call during application initialization to avoid first-call latency. + /// + public static void PreWarm() + { + var ops = new[] { BinaryOp.Add, BinaryOp.Subtract, BinaryOp.Multiply, BinaryOp.Divide }; + var types = new NPTypeCode[] + { + NPTypeCode.Int32, NPTypeCode.Int64, + NPTypeCode.Single, NPTypeCode.Double + }; + + foreach (var op in ops) + { + foreach (var dtype in types) + { + try + { + _ = Get(op, dtype); + } + catch (NotImplementedException) + { + // Not all combinations are implemented yet + } + } + } + } + + /// + /// Number of cached kernels. + /// + public static int CachedCount => _cache.Count; + + /// + /// Get all cached kernel keys. + /// + public static IEnumerable<(BinaryOp Op, NPTypeCode Type)> CachedKeys => _cache.Keys; + + /// + /// Clear the kernel cache. + /// + public static void Clear() + { + _cache.Clear(); + ILKernelGenerator.Clear(); + } + + /// + /// Get statistics about the kernel cache. + /// + public static (int Total, int ILGenerated) GetStats() + { + return (CachedCount, ILKernelGenerator.CachedCount); + } + + private static NPTypeCode GetTypeCode() where T : unmanaged + { + if (typeof(T) == typeof(bool)) return NPTypeCode.Boolean; + if (typeof(T) == typeof(byte)) return NPTypeCode.Byte; + if (typeof(T) == typeof(short)) return NPTypeCode.Int16; + if (typeof(T) == typeof(ushort)) return NPTypeCode.UInt16; + if (typeof(T) == typeof(int)) return NPTypeCode.Int32; + if (typeof(T) == typeof(uint)) return NPTypeCode.UInt32; + if (typeof(T) == typeof(long)) return NPTypeCode.Int64; + if (typeof(T) == typeof(ulong)) return NPTypeCode.UInt64; + if (typeof(T) == typeof(float)) return NPTypeCode.Single; + if (typeof(T) == typeof(double)) return NPTypeCode.Double; + if (typeof(T) == typeof(char)) return NPTypeCode.Char; + if (typeof(T) == typeof(decimal)) return NPTypeCode.Decimal; + throw new NotSupportedException($"Type {typeof(T)} not supported"); + } + } +} diff --git a/src/NumSharp.Core/Backends/Kernels/ReductionKernel.cs b/src/NumSharp.Core/Backends/Kernels/ReductionKernel.cs new file mode 100644 index 00000000..ea0ff2fb --- /dev/null +++ b/src/NumSharp.Core/Backends/Kernels/ReductionKernel.cs @@ -0,0 +1,377 @@ +using System; + +namespace NumSharp.Backends.Kernels +{ + /// + /// Reduction operation types supported by the IL kernel infrastructure. + /// + public enum ReductionOp + { + /// Sum of elements (add reduction) + Sum, + /// Product of elements (multiply reduction) + Prod, + /// Maximum element + Max, + /// Minimum element + Min, + /// Index of maximum element (returns int) + ArgMax, + /// Index of minimum element (returns int) + ArgMin, + /// Mean = Sum / count + Mean, + /// Cumulative sum (running total) + CumSum + } + + /// + /// Execution path for reduction operations. + /// + public enum ReductionPath + { + /// Reduce all elements to a single scalar value (no axis specified) + ElementWise, + /// Reduce along a specific axis, producing smaller-dimensional result + AxisReduction, + /// Cumulative reduction - same shape output, running accumulation + Cumulative + } + + /// + /// Cache key for element-wise (full array) reduction kernels. + /// Reduces all elements to a single scalar value. + /// + /// + /// Supports up to 144 unique kernels: 12 types × 8 operations × 1 path + /// + public readonly record struct ElementReductionKernelKey( + NPTypeCode InputType, + NPTypeCode AccumulatorType, + ReductionOp Op, + bool IsContiguous + ) + { + /// + /// Returns true if input and accumulator types are the same. + /// + public bool IsSameType => InputType == AccumulatorType; + + /// + /// Result type depends on operation: + /// - ArgMax/ArgMin: always Int32 + /// - Mean: always Double (or accumulator type if specified) + /// - Others: same as accumulator type + /// + public NPTypeCode ResultType => Op switch + { + ReductionOp.ArgMax => NPTypeCode.Int32, + ReductionOp.ArgMin => NPTypeCode.Int32, + _ => AccumulatorType + }; + + public override string ToString() => + $"Elem_{Op}_{InputType}_{AccumulatorType}_{(IsContiguous ? "Contig" : "Strided")}"; + } + + /// + /// Cache key for axis reduction kernels. + /// Reduces along a specific axis, producing an array with one fewer dimension. + /// + /// + /// These kernels handle the outer loop over non-reduced dimensions + /// and inner reduction along the specified axis. + /// + public readonly record struct AxisReductionKernelKey( + NPTypeCode InputType, + NPTypeCode AccumulatorType, + ReductionOp Op, + bool InnerAxisContiguous + ) + { + /// + /// Returns true if input and accumulator types are the same. + /// + public bool IsSameType => InputType == AccumulatorType; + + /// + /// Result type depends on operation. + /// + public NPTypeCode ResultType => Op switch + { + ReductionOp.ArgMax => NPTypeCode.Int32, + ReductionOp.ArgMin => NPTypeCode.Int32, + _ => AccumulatorType + }; + + public override string ToString() => + $"Axis_{Op}_{InputType}_{AccumulatorType}_{(InnerAxisContiguous ? "InnerContig" : "Strided")}"; + } + + /// + /// Cache key for cumulative reduction kernels (cumsum, etc.). + /// Output has same shape as input, each element is accumulation of elements before it. + /// + public readonly record struct CumulativeKernelKey( + NPTypeCode InputType, + NPTypeCode OutputType, + ReductionOp Op, + bool IsContiguous + ) + { + public bool IsSameType => InputType == OutputType; + + public override string ToString() => + $"Cum_{Op}_{InputType}_{OutputType}_{(IsContiguous ? "Contig" : "Strided")}"; + } + + /// + /// Delegate for element-wise reduction kernels. + /// Reduces all elements of an array to a single value. + /// + /// Pointer to input data + /// Input strides (element units, not bytes) + /// Input shape dimensions + /// Number of dimensions + /// Total number of elements + /// The reduced value (boxed) + /// + /// Returns object to handle different accumulator types without generic delegates. + /// The caller unboxes based on the kernel key's AccumulatorType. + /// For ArgMax/ArgMin, returns the index as int. + /// + public unsafe delegate object ElementReductionKernel( + void* input, + int* strides, + int* shape, + int ndim, + int totalSize + ); + + /// + /// Delegate for typed element-wise reduction kernels. + /// Returns the reduced value directly without boxing. + /// + /// Accumulator/result type + public unsafe delegate TResult TypedElementReductionKernel( + void* input, + int* strides, + int* shape, + int ndim, + int totalSize + ) where TResult : unmanaged; + + /// + /// Delegate for axis reduction kernels. + /// Reduces along a specific axis, writing to output array. + /// + /// Pointer to input data + /// Pointer to output data + /// Input strides (element units) + /// Input shape dimensions + /// Output strides (element units) + /// Axis to reduce along + /// Size of the axis being reduced + /// Number of input dimensions + /// Total number of output elements + public unsafe delegate void AxisReductionKernel( + void* input, + void* output, + int* inputStrides, + int* inputShape, + int* outputStrides, + int axis, + int axisSize, + int ndim, + int outputSize + ); + + /// + /// Delegate for cumulative reduction kernels (cumsum, etc.). + /// Output has same shape as input. + /// + /// Pointer to input data + /// Pointer to output data + /// Input strides (element units) + /// Shape dimensions + /// Number of dimensions + /// Total number of elements + public unsafe delegate void CumulativeKernel( + void* input, + void* output, + int* strides, + int* shape, + int ndim, + int totalSize + ); + + /// + /// Delegate for cumulative axis reduction kernels. + /// Computes running accumulation along a specific axis. + /// + /// Pointer to input data + /// Pointer to output data + /// Input strides (element units) + /// Shape dimensions + /// Axis to accumulate along + /// Number of dimensions + /// Total number of elements + public unsafe delegate void CumulativeAxisKernel( + void* input, + void* output, + int* inputStrides, + int* shape, + int axis, + int ndim, + int totalSize + ); + + /// + /// Extension methods for ReductionOp. + /// + public static class ReductionOpExtensions + { + /// + /// Get the identity element for this reduction operation. + /// + public static object GetIdentity(this ReductionOp op, NPTypeCode type) + { + return op switch + { + ReductionOp.Sum => type.GetDefaultValue(), + ReductionOp.Prod => type.GetOneValue(), + ReductionOp.Max => type.GetMinValue(), + ReductionOp.Min => type.GetMaxValue(), + ReductionOp.ArgMax => 0, + ReductionOp.ArgMin => 0, + ReductionOp.Mean => type.GetDefaultValue(), + ReductionOp.CumSum => type.GetDefaultValue(), + _ => throw new NotSupportedException($"Operation {op} has no identity element") + }; + } + + /// + /// Check if this reduction returns an index rather than a value. + /// + public static bool ReturnsIndex(this ReductionOp op) + { + return op == ReductionOp.ArgMax || op == ReductionOp.ArgMin; + } + + /// + /// Check if this reduction is order-dependent (cannot be parallelized trivially). + /// + public static bool IsOrderDependent(this ReductionOp op) + { + return op == ReductionOp.ArgMax || op == ReductionOp.ArgMin; + } + + /// + /// Check if this reduction has SIMD horizontal reduction support. + /// + public static bool HasSimdSupport(this ReductionOp op) + { + // Vector256 has Sum (horizontal add) but not Max/Min horizontal + // For Max/Min we need to reduce the vector at the end + return op == ReductionOp.Sum || op == ReductionOp.Max || op == ReductionOp.Min; + } + } + + /// + /// Extension methods for NPTypeCode related to reductions. + /// + public static class ReductionTypeExtensions + { + /// + /// Get the default value (additive identity) for a type. + /// + public static object GetDefaultValue(this NPTypeCode type) + { + return type switch + { + NPTypeCode.Boolean => false, + NPTypeCode.Byte => (byte)0, + NPTypeCode.Int16 => (short)0, + NPTypeCode.UInt16 => (ushort)0, + NPTypeCode.Int32 => 0, + NPTypeCode.UInt32 => 0u, + NPTypeCode.Int64 => 0L, + NPTypeCode.UInt64 => 0UL, + NPTypeCode.Char => (char)0, + NPTypeCode.Single => 0f, + NPTypeCode.Double => 0d, + NPTypeCode.Decimal => 0m, + _ => throw new NotSupportedException($"Type {type} not supported") + }; + } + + /// + /// Get the multiplicative identity (1) for a type. + /// + public static object GetOneValue(this NPTypeCode type) + { + return type switch + { + NPTypeCode.Boolean => true, + NPTypeCode.Byte => (byte)1, + NPTypeCode.Int16 => (short)1, + NPTypeCode.UInt16 => (ushort)1, + NPTypeCode.Int32 => 1, + NPTypeCode.UInt32 => 1u, + NPTypeCode.Int64 => 1L, + NPTypeCode.UInt64 => 1UL, + NPTypeCode.Char => (char)1, + NPTypeCode.Single => 1f, + NPTypeCode.Double => 1d, + NPTypeCode.Decimal => 1m, + _ => throw new NotSupportedException($"Type {type} not supported") + }; + } + + /// + /// Get the minimum value for a type (for Max reduction identity). + /// + public static object GetMinValue(this NPTypeCode type) + { + return type switch + { + NPTypeCode.Boolean => false, + NPTypeCode.Byte => byte.MinValue, + NPTypeCode.Int16 => short.MinValue, + NPTypeCode.UInt16 => ushort.MinValue, + NPTypeCode.Int32 => int.MinValue, + NPTypeCode.UInt32 => uint.MinValue, + NPTypeCode.Int64 => long.MinValue, + NPTypeCode.UInt64 => ulong.MinValue, + NPTypeCode.Char => char.MinValue, + NPTypeCode.Single => float.NegativeInfinity, + NPTypeCode.Double => double.NegativeInfinity, + NPTypeCode.Decimal => decimal.MinValue, + _ => throw new NotSupportedException($"Type {type} not supported") + }; + } + + /// + /// Get the maximum value for a type (for Min reduction identity). + /// + public static object GetMaxValue(this NPTypeCode type) + { + return type switch + { + NPTypeCode.Boolean => true, + NPTypeCode.Byte => byte.MaxValue, + NPTypeCode.Int16 => short.MaxValue, + NPTypeCode.UInt16 => ushort.MaxValue, + NPTypeCode.Int32 => int.MaxValue, + NPTypeCode.UInt32 => uint.MaxValue, + NPTypeCode.Int64 => long.MaxValue, + NPTypeCode.UInt64 => ulong.MaxValue, + NPTypeCode.Char => char.MaxValue, + NPTypeCode.Single => float.PositiveInfinity, + NPTypeCode.Double => double.PositiveInfinity, + NPTypeCode.Decimal => decimal.MaxValue, + _ => throw new NotSupportedException($"Type {type} not supported") + }; + } + } +} diff --git a/src/NumSharp.Core/Backends/Kernels/ScalarKernel.cs b/src/NumSharp.Core/Backends/Kernels/ScalarKernel.cs new file mode 100644 index 00000000..00140c97 --- /dev/null +++ b/src/NumSharp.Core/Backends/Kernels/ScalarKernel.cs @@ -0,0 +1,47 @@ +namespace NumSharp.Backends.Kernels +{ + /// + /// Cache key for unary scalar operation kernels. + /// Identifies a unique kernel by input type, output type, and operation. + /// + /// + /// Used to cache IL-generated Func delegates that eliminate dynamic dispatch overhead. + /// The delegate type varies based on input/output types, so we store as System.Delegate. + /// + public readonly record struct UnaryScalarKernelKey( + NPTypeCode InputType, + NPTypeCode OutputType, + UnaryOp Op + ) + { + /// + /// Returns true if input and output types are the same. + /// + public bool IsSameType => InputType == OutputType; + + public override string ToString() => $"Scalar_{Op}_{InputType}_{OutputType}"; + } + + /// + /// Cache key for binary scalar operation kernels. + /// Identifies a unique kernel by LHS type, RHS type, result type, and operation. + /// + /// + /// Used to cache IL-generated Func delegates that eliminate dynamic dispatch overhead. + /// The delegate type varies based on operand/result types, so we store as System.Delegate. + /// + public readonly record struct BinaryScalarKernelKey( + NPTypeCode LhsType, + NPTypeCode RhsType, + NPTypeCode ResultType, + BinaryOp Op + ) + { + /// + /// Returns true if all three types are the same. + /// + public bool IsSameType => LhsType == RhsType && RhsType == ResultType; + + public override string ToString() => $"Scalar_{Op}_{LhsType}_{RhsType}_{ResultType}"; + } +} diff --git a/src/NumSharp.Core/Backends/Kernels/SimdKernels.cs b/src/NumSharp.Core/Backends/Kernels/SimdKernels.cs new file mode 100644 index 00000000..afe04afe --- /dev/null +++ b/src/NumSharp.Core/Backends/Kernels/SimdKernels.cs @@ -0,0 +1,626 @@ +using System; +using System.Runtime.CompilerServices; +using System.Runtime.Intrinsics; + +namespace NumSharp.Backends.Kernels +{ + /// + /// SIMD-optimized binary operation kernels. + /// Each method implements all execution paths (FULL, SCALAR, CHUNK, GENERAL) + /// and dispatches internally based on stride analysis. + /// + public static partial class SimdKernels + { + #region Int32 Add + + /// + /// SIMD-optimized addition for Int32 arrays. + /// + public static unsafe void Add_Int32( + int* lhs, int* rhs, int* result, + int* lhsStrides, int* rhsStrides, int* shape, + int ndim, int totalSize) + { + var path = StrideDetector.Classify(lhsStrides, rhsStrides, shape, ndim); + + switch (path) + { + case ExecutionPath.SimdFull: + SimdFull_Add_Int32(lhs, rhs, result, totalSize); + break; + case ExecutionPath.SimdScalarRight: + SimdScalarRight_Add_Int32(lhs, *rhs, result, totalSize); + break; + case ExecutionPath.SimdScalarLeft: + SimdScalarLeft_Add_Int32(*lhs, rhs, result, totalSize); + break; + case ExecutionPath.SimdChunk: + SimdChunk_Add_Int32(lhs, rhs, result, lhsStrides, rhsStrides, shape, ndim); + break; + default: + General_Add_Int32(lhs, rhs, result, lhsStrides, rhsStrides, shape, ndim, totalSize); + break; + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static unsafe void SimdFull_Add_Int32(int* lhs, int* rhs, int* result, int totalSize) + { + int i = 0; + int vectorEnd = totalSize - Vector256.Count; + + for (; i <= vectorEnd; i += Vector256.Count) + { + var vl = Vector256.Load(lhs + i); + var vr = Vector256.Load(rhs + i); + Vector256.Store(vl + vr, result + i); + } + + for (; i < totalSize; i++) + result[i] = lhs[i] + rhs[i]; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static unsafe void SimdScalarRight_Add_Int32(int* lhs, int scalar, int* result, int totalSize) + { + var scalarVec = Vector256.Create(scalar); + int i = 0; + int vectorEnd = totalSize - Vector256.Count; + + for (; i <= vectorEnd; i += Vector256.Count) + { + var vl = Vector256.Load(lhs + i); + Vector256.Store(vl + scalarVec, result + i); + } + + for (; i < totalSize; i++) + result[i] = lhs[i] + scalar; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static unsafe void SimdScalarLeft_Add_Int32(int scalar, int* rhs, int* result, int totalSize) + { + var scalarVec = Vector256.Create(scalar); + int i = 0; + int vectorEnd = totalSize - Vector256.Count; + + for (; i <= vectorEnd; i += Vector256.Count) + { + var vr = Vector256.Load(rhs + i); + Vector256.Store(scalarVec + vr, result + i); + } + + for (; i < totalSize; i++) + result[i] = scalar + rhs[i]; + } + + private static unsafe void SimdChunk_Add_Int32( + int* lhs, int* rhs, int* result, + int* lhsStrides, int* rhsStrides, int* shape, int ndim) + { + int innerSize = shape[ndim - 1]; + int outerSize = 1; + for (int d = 0; d < ndim - 1; d++) + outerSize *= shape[d]; + + int lhsInner = lhsStrides[ndim - 1]; + int rhsInner = rhsStrides[ndim - 1]; + + for (int outer = 0; outer < outerSize; outer++) + { + int lhsOffset = 0, rhsOffset = 0; + int idx = outer; + for (int d = ndim - 2; d >= 0; d--) + { + int coord = idx % shape[d]; + idx /= shape[d]; + lhsOffset += coord * lhsStrides[d]; + rhsOffset += coord * rhsStrides[d]; + } + + int* lhsRow = lhs + lhsOffset; + int* rhsRow = rhs + rhsOffset; + int* resultRow = result + outer * innerSize; + + if (lhsInner == 1 && rhsInner == 1) + SimdFull_Add_Int32(lhsRow, rhsRow, resultRow, innerSize); + else if (rhsInner == 0) + SimdScalarRight_Add_Int32(lhsRow, *rhsRow, resultRow, innerSize); + else if (lhsInner == 0) + SimdScalarLeft_Add_Int32(*lhsRow, rhsRow, resultRow, innerSize); + else + { + for (int i = 0; i < innerSize; i++) + resultRow[i] = lhsRow[i * lhsInner] + rhsRow[i * rhsInner]; + } + } + } + + private static unsafe void General_Add_Int32( + int* lhs, int* rhs, int* result, + int* lhsStrides, int* rhsStrides, int* shape, int ndim, int totalSize) + { + Span coords = stackalloc int[ndim]; + + for (int i = 0; i < totalSize; i++) + { + int lhsOffset = 0, rhsOffset = 0; + for (int d = 0; d < ndim; d++) + { + lhsOffset += coords[d] * lhsStrides[d]; + rhsOffset += coords[d] * rhsStrides[d]; + } + + result[i] = lhs[lhsOffset] + rhs[rhsOffset]; + + for (int d = ndim - 1; d >= 0; d--) + { + if (++coords[d] < shape[d]) + break; + coords[d] = 0; + } + } + } + + #endregion + + #region Double Add + + /// + /// SIMD-optimized addition for Double arrays. + /// + public static unsafe void Add_Double( + double* lhs, double* rhs, double* result, + int* lhsStrides, int* rhsStrides, int* shape, + int ndim, int totalSize) + { + var path = StrideDetector.Classify(lhsStrides, rhsStrides, shape, ndim); + + switch (path) + { + case ExecutionPath.SimdFull: + SimdFull_Add_Double(lhs, rhs, result, totalSize); + break; + case ExecutionPath.SimdScalarRight: + SimdScalarRight_Add_Double(lhs, *rhs, result, totalSize); + break; + case ExecutionPath.SimdScalarLeft: + SimdScalarLeft_Add_Double(*lhs, rhs, result, totalSize); + break; + case ExecutionPath.SimdChunk: + SimdChunk_Add_Double(lhs, rhs, result, lhsStrides, rhsStrides, shape, ndim); + break; + default: + General_Add_Double(lhs, rhs, result, lhsStrides, rhsStrides, shape, ndim, totalSize); + break; + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static unsafe void SimdFull_Add_Double(double* lhs, double* rhs, double* result, int totalSize) + { + int i = 0; + int vectorEnd = totalSize - Vector256.Count; + + for (; i <= vectorEnd; i += Vector256.Count) + { + var vl = Vector256.Load(lhs + i); + var vr = Vector256.Load(rhs + i); + Vector256.Store(vl + vr, result + i); + } + + for (; i < totalSize; i++) + result[i] = lhs[i] + rhs[i]; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static unsafe void SimdScalarRight_Add_Double(double* lhs, double scalar, double* result, int totalSize) + { + var scalarVec = Vector256.Create(scalar); + int i = 0; + int vectorEnd = totalSize - Vector256.Count; + + for (; i <= vectorEnd; i += Vector256.Count) + { + var vl = Vector256.Load(lhs + i); + Vector256.Store(vl + scalarVec, result + i); + } + + for (; i < totalSize; i++) + result[i] = lhs[i] + scalar; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static unsafe void SimdScalarLeft_Add_Double(double scalar, double* rhs, double* result, int totalSize) + { + var scalarVec = Vector256.Create(scalar); + int i = 0; + int vectorEnd = totalSize - Vector256.Count; + + for (; i <= vectorEnd; i += Vector256.Count) + { + var vr = Vector256.Load(rhs + i); + Vector256.Store(scalarVec + vr, result + i); + } + + for (; i < totalSize; i++) + result[i] = scalar + rhs[i]; + } + + private static unsafe void SimdChunk_Add_Double( + double* lhs, double* rhs, double* result, + int* lhsStrides, int* rhsStrides, int* shape, int ndim) + { + int innerSize = shape[ndim - 1]; + int outerSize = 1; + for (int d = 0; d < ndim - 1; d++) + outerSize *= shape[d]; + + int lhsInner = lhsStrides[ndim - 1]; + int rhsInner = rhsStrides[ndim - 1]; + + for (int outer = 0; outer < outerSize; outer++) + { + int lhsOffset = 0, rhsOffset = 0; + int idx = outer; + for (int d = ndim - 2; d >= 0; d--) + { + int coord = idx % shape[d]; + idx /= shape[d]; + lhsOffset += coord * lhsStrides[d]; + rhsOffset += coord * rhsStrides[d]; + } + + double* lhsRow = lhs + lhsOffset; + double* rhsRow = rhs + rhsOffset; + double* resultRow = result + outer * innerSize; + + if (lhsInner == 1 && rhsInner == 1) + SimdFull_Add_Double(lhsRow, rhsRow, resultRow, innerSize); + else if (rhsInner == 0) + SimdScalarRight_Add_Double(lhsRow, *rhsRow, resultRow, innerSize); + else if (lhsInner == 0) + SimdScalarLeft_Add_Double(*lhsRow, rhsRow, resultRow, innerSize); + else + { + for (int i = 0; i < innerSize; i++) + resultRow[i] = lhsRow[i * lhsInner] + rhsRow[i * rhsInner]; + } + } + } + + private static unsafe void General_Add_Double( + double* lhs, double* rhs, double* result, + int* lhsStrides, int* rhsStrides, int* shape, int ndim, int totalSize) + { + Span coords = stackalloc int[ndim]; + + for (int i = 0; i < totalSize; i++) + { + int lhsOffset = 0, rhsOffset = 0; + for (int d = 0; d < ndim; d++) + { + lhsOffset += coords[d] * lhsStrides[d]; + rhsOffset += coords[d] * rhsStrides[d]; + } + + result[i] = lhs[lhsOffset] + rhs[rhsOffset]; + + for (int d = ndim - 1; d >= 0; d--) + { + if (++coords[d] < shape[d]) + break; + coords[d] = 0; + } + } + } + + #endregion + + #region Single Add + + /// + /// SIMD-optimized addition for Single (float) arrays. + /// + public static unsafe void Add_Single( + float* lhs, float* rhs, float* result, + int* lhsStrides, int* rhsStrides, int* shape, + int ndim, int totalSize) + { + var path = StrideDetector.Classify(lhsStrides, rhsStrides, shape, ndim); + + switch (path) + { + case ExecutionPath.SimdFull: + SimdFull_Add_Single(lhs, rhs, result, totalSize); + break; + case ExecutionPath.SimdScalarRight: + SimdScalarRight_Add_Single(lhs, *rhs, result, totalSize); + break; + case ExecutionPath.SimdScalarLeft: + SimdScalarLeft_Add_Single(*lhs, rhs, result, totalSize); + break; + case ExecutionPath.SimdChunk: + SimdChunk_Add_Single(lhs, rhs, result, lhsStrides, rhsStrides, shape, ndim); + break; + default: + General_Add_Single(lhs, rhs, result, lhsStrides, rhsStrides, shape, ndim, totalSize); + break; + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static unsafe void SimdFull_Add_Single(float* lhs, float* rhs, float* result, int totalSize) + { + int i = 0; + int vectorEnd = totalSize - Vector256.Count; + + for (; i <= vectorEnd; i += Vector256.Count) + { + var vl = Vector256.Load(lhs + i); + var vr = Vector256.Load(rhs + i); + Vector256.Store(vl + vr, result + i); + } + + for (; i < totalSize; i++) + result[i] = lhs[i] + rhs[i]; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static unsafe void SimdScalarRight_Add_Single(float* lhs, float scalar, float* result, int totalSize) + { + var scalarVec = Vector256.Create(scalar); + int i = 0; + int vectorEnd = totalSize - Vector256.Count; + + for (; i <= vectorEnd; i += Vector256.Count) + { + var vl = Vector256.Load(lhs + i); + Vector256.Store(vl + scalarVec, result + i); + } + + for (; i < totalSize; i++) + result[i] = lhs[i] + scalar; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static unsafe void SimdScalarLeft_Add_Single(float scalar, float* rhs, float* result, int totalSize) + { + var scalarVec = Vector256.Create(scalar); + int i = 0; + int vectorEnd = totalSize - Vector256.Count; + + for (; i <= vectorEnd; i += Vector256.Count) + { + var vr = Vector256.Load(rhs + i); + Vector256.Store(scalarVec + vr, result + i); + } + + for (; i < totalSize; i++) + result[i] = scalar + rhs[i]; + } + + private static unsafe void SimdChunk_Add_Single( + float* lhs, float* rhs, float* result, + int* lhsStrides, int* rhsStrides, int* shape, int ndim) + { + int innerSize = shape[ndim - 1]; + int outerSize = 1; + for (int d = 0; d < ndim - 1; d++) + outerSize *= shape[d]; + + int lhsInner = lhsStrides[ndim - 1]; + int rhsInner = rhsStrides[ndim - 1]; + + for (int outer = 0; outer < outerSize; outer++) + { + int lhsOffset = 0, rhsOffset = 0; + int idx = outer; + for (int d = ndim - 2; d >= 0; d--) + { + int coord = idx % shape[d]; + idx /= shape[d]; + lhsOffset += coord * lhsStrides[d]; + rhsOffset += coord * rhsStrides[d]; + } + + float* lhsRow = lhs + lhsOffset; + float* rhsRow = rhs + rhsOffset; + float* resultRow = result + outer * innerSize; + + if (lhsInner == 1 && rhsInner == 1) + SimdFull_Add_Single(lhsRow, rhsRow, resultRow, innerSize); + else if (rhsInner == 0) + SimdScalarRight_Add_Single(lhsRow, *rhsRow, resultRow, innerSize); + else if (lhsInner == 0) + SimdScalarLeft_Add_Single(*lhsRow, rhsRow, resultRow, innerSize); + else + { + for (int i = 0; i < innerSize; i++) + resultRow[i] = lhsRow[i * lhsInner] + rhsRow[i * rhsInner]; + } + } + } + + private static unsafe void General_Add_Single( + float* lhs, float* rhs, float* result, + int* lhsStrides, int* rhsStrides, int* shape, int ndim, int totalSize) + { + Span coords = stackalloc int[ndim]; + + for (int i = 0; i < totalSize; i++) + { + int lhsOffset = 0, rhsOffset = 0; + for (int d = 0; d < ndim; d++) + { + lhsOffset += coords[d] * lhsStrides[d]; + rhsOffset += coords[d] * rhsStrides[d]; + } + + result[i] = lhs[lhsOffset] + rhs[rhsOffset]; + + for (int d = ndim - 1; d >= 0; d--) + { + if (++coords[d] < shape[d]) + break; + coords[d] = 0; + } + } + } + + #endregion + + #region Int64 Add + + /// + /// SIMD-optimized addition for Int64 arrays. + /// + public static unsafe void Add_Int64( + long* lhs, long* rhs, long* result, + int* lhsStrides, int* rhsStrides, int* shape, + int ndim, int totalSize) + { + var path = StrideDetector.Classify(lhsStrides, rhsStrides, shape, ndim); + + switch (path) + { + case ExecutionPath.SimdFull: + SimdFull_Add_Int64(lhs, rhs, result, totalSize); + break; + case ExecutionPath.SimdScalarRight: + SimdScalarRight_Add_Int64(lhs, *rhs, result, totalSize); + break; + case ExecutionPath.SimdScalarLeft: + SimdScalarLeft_Add_Int64(*lhs, rhs, result, totalSize); + break; + case ExecutionPath.SimdChunk: + SimdChunk_Add_Int64(lhs, rhs, result, lhsStrides, rhsStrides, shape, ndim); + break; + default: + General_Add_Int64(lhs, rhs, result, lhsStrides, rhsStrides, shape, ndim, totalSize); + break; + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static unsafe void SimdFull_Add_Int64(long* lhs, long* rhs, long* result, int totalSize) + { + int i = 0; + int vectorEnd = totalSize - Vector256.Count; + + for (; i <= vectorEnd; i += Vector256.Count) + { + var vl = Vector256.Load(lhs + i); + var vr = Vector256.Load(rhs + i); + Vector256.Store(vl + vr, result + i); + } + + for (; i < totalSize; i++) + result[i] = lhs[i] + rhs[i]; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static unsafe void SimdScalarRight_Add_Int64(long* lhs, long scalar, long* result, int totalSize) + { + var scalarVec = Vector256.Create(scalar); + int i = 0; + int vectorEnd = totalSize - Vector256.Count; + + for (; i <= vectorEnd; i += Vector256.Count) + { + var vl = Vector256.Load(lhs + i); + Vector256.Store(vl + scalarVec, result + i); + } + + for (; i < totalSize; i++) + result[i] = lhs[i] + scalar; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static unsafe void SimdScalarLeft_Add_Int64(long scalar, long* rhs, long* result, int totalSize) + { + var scalarVec = Vector256.Create(scalar); + int i = 0; + int vectorEnd = totalSize - Vector256.Count; + + for (; i <= vectorEnd; i += Vector256.Count) + { + var vr = Vector256.Load(rhs + i); + Vector256.Store(scalarVec + vr, result + i); + } + + for (; i < totalSize; i++) + result[i] = scalar + rhs[i]; + } + + private static unsafe void SimdChunk_Add_Int64( + long* lhs, long* rhs, long* result, + int* lhsStrides, int* rhsStrides, int* shape, int ndim) + { + int innerSize = shape[ndim - 1]; + int outerSize = 1; + for (int d = 0; d < ndim - 1; d++) + outerSize *= shape[d]; + + int lhsInner = lhsStrides[ndim - 1]; + int rhsInner = rhsStrides[ndim - 1]; + + for (int outer = 0; outer < outerSize; outer++) + { + int lhsOffset = 0, rhsOffset = 0; + int idx = outer; + for (int d = ndim - 2; d >= 0; d--) + { + int coord = idx % shape[d]; + idx /= shape[d]; + lhsOffset += coord * lhsStrides[d]; + rhsOffset += coord * rhsStrides[d]; + } + + long* lhsRow = lhs + lhsOffset; + long* rhsRow = rhs + rhsOffset; + long* resultRow = result + outer * innerSize; + + if (lhsInner == 1 && rhsInner == 1) + SimdFull_Add_Int64(lhsRow, rhsRow, resultRow, innerSize); + else if (rhsInner == 0) + SimdScalarRight_Add_Int64(lhsRow, *rhsRow, resultRow, innerSize); + else if (lhsInner == 0) + SimdScalarLeft_Add_Int64(*lhsRow, rhsRow, resultRow, innerSize); + else + { + for (int i = 0; i < innerSize; i++) + resultRow[i] = lhsRow[i * lhsInner] + rhsRow[i * rhsInner]; + } + } + } + + private static unsafe void General_Add_Int64( + long* lhs, long* rhs, long* result, + int* lhsStrides, int* rhsStrides, int* shape, int ndim, int totalSize) + { + Span coords = stackalloc int[ndim]; + + for (int i = 0; i < totalSize; i++) + { + int lhsOffset = 0, rhsOffset = 0; + for (int d = 0; d < ndim; d++) + { + lhsOffset += coords[d] * lhsStrides[d]; + rhsOffset += coords[d] * rhsStrides[d]; + } + + result[i] = lhs[lhsOffset] + rhs[rhsOffset]; + + for (int d = ndim - 1; d >= 0; d--) + { + if (++coords[d] < shape[d]) + break; + coords[d] = 0; + } + } + } + + #endregion + } +} diff --git a/src/NumSharp.Core/Backends/Kernels/SimdThresholds.cs b/src/NumSharp.Core/Backends/Kernels/SimdThresholds.cs new file mode 100644 index 00000000..7f4ef9b8 --- /dev/null +++ b/src/NumSharp.Core/Backends/Kernels/SimdThresholds.cs @@ -0,0 +1,65 @@ +namespace NumSharp.Backends.Kernels +{ + /// + /// Minimum element counts for SIMD to be beneficial. + /// Below these thresholds, the overhead of SIMD setup may exceed the benefits. + /// Based on Vector256 (32 bytes) width. + /// + public static class SimdThresholds + { + /// Minimum elements for byte (32 per Vector256). + public const int Byte = 64; + + /// Minimum elements for Int16/UInt16 (16 per Vector256). + public const int Int16 = 64; + + /// Minimum elements for Int32/UInt32/Single (8 per Vector256). + public const int Int32 = 96; + + /// Minimum elements for Int64/UInt64/Double (4 per Vector256). + public const int Int64 = 256; + + /// Minimum elements for Single (8 per Vector256). + public const int Single = 96; + + /// Minimum elements for Double (4 per Vector256) - conservative. + public const int Double = 512; + + /// + /// Size above which memory bandwidth dominates and SIMD speedup diminishes. + /// At very large sizes, we're limited by memory bandwidth, not compute. + /// + public const int MemoryBound = 10_000_000; + + /// + /// Get the minimum threshold for a given NPTypeCode. + /// + public static int GetThreshold(NPTypeCode typeCode) + { + return typeCode switch + { + NPTypeCode.Boolean => Byte, + NPTypeCode.Byte => Byte, + NPTypeCode.Int16 => Int16, + NPTypeCode.UInt16 => Int16, + NPTypeCode.Int32 => Int32, + NPTypeCode.UInt32 => Int32, + NPTypeCode.Int64 => Int64, + NPTypeCode.UInt64 => Int64, + NPTypeCode.Single => Single, + NPTypeCode.Double => Double, + NPTypeCode.Char => Int16, + NPTypeCode.Decimal => Int64, // No SIMD for Decimal, use high threshold + _ => Int32 + }; + } + + /// + /// Returns true if the array size is above the SIMD threshold for the given type. + /// + public static bool ShouldUseSIMD(NPTypeCode typeCode, int size) + { + return size >= GetThreshold(typeCode); + } + } +} diff --git a/src/NumSharp.Core/Backends/Kernels/StrideDetector.cs b/src/NumSharp.Core/Backends/Kernels/StrideDetector.cs new file mode 100644 index 00000000..1497fdc3 --- /dev/null +++ b/src/NumSharp.Core/Backends/Kernels/StrideDetector.cs @@ -0,0 +1,121 @@ +using System.Runtime.CompilerServices; +using System.Runtime.Intrinsics; + +namespace NumSharp.Backends.Kernels +{ + /// + /// Stride-based pattern detection for selecting optimal SIMD execution paths. + /// All methods are aggressively inlined for minimal dispatch overhead. + /// + public static class StrideDetector + { + /// + /// Check if array is fully contiguous (C-order). + /// An array is contiguous if strides match expected C-order values: + /// strides[n-1] = 1, strides[i] = strides[i+1] * shape[i+1] + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static unsafe bool IsContiguous(int* strides, int* shape, int ndim) + { + if (ndim == 0) return true; + + int expectedStride = 1; + for (int d = ndim - 1; d >= 0; d--) + { + // Skip dimensions of size 1 (they don't affect contiguity) + if (shape[d] > 1 && strides[d] != expectedStride) + return false; + expectedStride *= shape[d]; + } + return true; + } + + /// + /// Check if array is a scalar (all strides are zero). + /// A scalar is broadcast to any shape - each element accesses the same value. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static unsafe bool IsScalar(int* strides, int ndim) + { + for (int d = 0; d < ndim; d++) + { + if (strides[d] != 0) + return false; + } + return true; + } + + /// + /// Check if inner dimension is suitable for SIMD chunking. + /// Returns true if both operands have inner stride of 1 (contiguous) or 0 (broadcast). + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static unsafe bool CanSimdChunk(int* lhsStrides, int* rhsStrides, int* shape, int ndim) + where T : unmanaged + { + if (ndim == 0) return false; + + int innerSize = shape[ndim - 1]; + int minVectorSize = Vector256.Count; + + // Inner dimension must be large enough for SIMD + if (innerSize < minVectorSize) + return false; + + int lhsInner = lhsStrides[ndim - 1]; + int rhsInner = rhsStrides[ndim - 1]; + + // Both must be contiguous (1) or broadcast (0) in inner dimension + return (lhsInner == 1 || lhsInner == 0) && + (rhsInner == 1 || rhsInner == 0); + } + + /// + /// Classify the binary operation into an execution path based on stride analysis. + /// Classification priority: + /// 1. SimdFull - both fully contiguous (fastest) + /// 2. SimdScalarRight/Left - one operand is scalar + /// 3. SimdChunk - inner dimension is contiguous/broadcast + /// 4. General - fallback for arbitrary strides + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static unsafe ExecutionPath Classify( + int* lhsStrides, + int* rhsStrides, + int* shape, + int ndim) + where T : unmanaged + { + bool lhsContiguous = IsContiguous(lhsStrides, shape, ndim); + bool rhsContiguous = IsContiguous(rhsStrides, shape, ndim); + + // PATH 1: Both fully contiguous - use flat SIMD loop + if (lhsContiguous && rhsContiguous) + { + return ExecutionPath.SimdFull; + } + + // PATH 2: Scalar broadcast - use scalar splat + bool rhsScalar = IsScalar(rhsStrides, ndim); + if (rhsScalar) + { + return ExecutionPath.SimdScalarRight; + } + + bool lhsScalar = IsScalar(lhsStrides, ndim); + if (lhsScalar) + { + return ExecutionPath.SimdScalarLeft; + } + + // PATH 3: Inner dimension contiguous - use chunked SIMD + if (CanSimdChunk(lhsStrides, rhsStrides, shape, ndim)) + { + return ExecutionPath.SimdChunk; + } + + // PATH 4: General case - scalar loop with offset calculation + return ExecutionPath.General; + } + } +} diff --git a/src/NumSharp.Core/Backends/TensorEngine.cs b/src/NumSharp.Core/Backends/TensorEngine.cs index 0572e2fc..0907676e 100644 --- a/src/NumSharp.Core/Backends/TensorEngine.cs +++ b/src/NumSharp.Core/Backends/TensorEngine.cs @@ -110,7 +110,18 @@ public abstract class TensorEngine #region Logic - public abstract NDArray Compare(in NDArray lhs, in NDArray rhs); + // Comparison operations - all return NDArray + public abstract NDArray Compare(in NDArray lhs, in NDArray rhs); // Equal + public abstract NDArray NotEqual(in NDArray lhs, in NDArray rhs); + public abstract NDArray Less(in NDArray lhs, in NDArray rhs); + public abstract NDArray LessEqual(in NDArray lhs, in NDArray rhs); + public abstract NDArray Greater(in NDArray lhs, in NDArray rhs); + public abstract NDArray GreaterEqual(in NDArray lhs, in NDArray rhs); + + // Bitwise operations + public abstract NDArray BitwiseAnd(in NDArray lhs, in NDArray rhs); + public abstract NDArray BitwiseOr(in NDArray lhs, in NDArray rhs); + public abstract NDArray BitwiseXor(in NDArray lhs, in NDArray rhs); public abstract bool All(NDArray nd); public abstract NDArray All(NDArray nd, int axis); public abstract bool AllClose(NDArray a, NDArray b, double rtol = 1.0E-5, double atol = 1.0E-8, bool equal_nan = false); diff --git a/src/NumSharp.Core/Backends/Unmanaged/UnmanagedStorage.Slicing.cs b/src/NumSharp.Core/Backends/Unmanaged/UnmanagedStorage.Slicing.cs index 45701506..6da48e65 100644 --- a/src/NumSharp.Core/Backends/Unmanaged/UnmanagedStorage.Slicing.cs +++ b/src/NumSharp.Core/Backends/Unmanaged/UnmanagedStorage.Slicing.cs @@ -110,7 +110,19 @@ private UnmanagedStorage GetViewInternal(params Slice[] slices) var slicedShape = _shape.Slice(slices); - // NumPy-aligned: All slices return views (aliases) that share memory with the original. + // NumPy-aligned optimization: For contiguous slices, slice the InternalArray directly + // and create a fresh shape with offset=0. This matches NumPy's data pointer adjustment + // for contiguous views and makes IsSliced=false for contiguous slices. + if (slicedShape.IsContiguous && slicedShape.offset > 0) + { + // Create a fresh contiguous shape (no offset) + var freshShape = new Shape(slicedShape.dimensions); + var view = new UnmanagedStorage(InternalArray.Slice(slicedShape.offset, slicedShape.size), freshShape); + view._baseStorage = _baseStorage ?? this; + return view; + } + + // Non-contiguous slices: create an alias with the sliced shape. // The slicedShape contains the correct offset and strides computed by Shape.Slice(). // Views with non-zero offset or non-standard strides use coordinate-based access. return Alias(slicedShape); diff --git a/src/NumSharp.Core/Generics/NDArray`1.Operators.cs b/src/NumSharp.Core/Generics/NDArray`1.Operators.cs new file mode 100644 index 00000000..0c65812f --- /dev/null +++ b/src/NumSharp.Core/Generics/NDArray`1.Operators.cs @@ -0,0 +1,31 @@ +namespace NumSharp.Generic +{ + public partial class NDArray + { + /// + /// Element-wise bitwise AND for typed arrays. + /// Resolves ambiguity when using NDArray<bool> operands. + /// + public static NDArray operator &(NDArray lhs, NDArray rhs) + { + return ((NDArray)lhs).TensorEngine.BitwiseAnd(lhs, rhs).MakeGeneric(); + } + + /// + /// Element-wise bitwise OR for typed arrays. + /// Resolves ambiguity when using NDArray<bool> operands. + /// + public static NDArray operator |(NDArray lhs, NDArray rhs) + { + return ((NDArray)lhs).TensorEngine.BitwiseOr(lhs, rhs).MakeGeneric(); + } + + /// + /// Element-wise bitwise XOR for typed arrays. + /// + public static NDArray operator ^(NDArray lhs, NDArray rhs) + { + return ((NDArray)lhs).TensorEngine.BitwiseXor(lhs, rhs).MakeGeneric(); + } + } +} diff --git a/src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.Boolean.cs b/src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.Boolean.cs deleted file mode 100644 index 2907841b..00000000 --- a/src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.Boolean.cs +++ /dev/null @@ -1,348 +0,0 @@ -//Generated by Regex Templating Engine at 21/07/2019 23:20:36 UTC -//template source: C:\Users\Eli-PC\Desktop\SciSharp\NumSharp\src\NumSharp.Core\Operations\Elementwise\Templates\Default.Op.Boolean.template.cs - -using System; -using System.Diagnostics.CodeAnalysis; -using System.Runtime.CompilerServices; -using NumSharp.Generic; -using NumSharp.Utilities; - -namespace NumSharp.Backends -{ - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray EqualsBoolean(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of bool - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "==" - case NPTypeCode.Boolean: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((bool*)lhs.Address) %(op) (*((bool*)rhs.Address)))).MakeGeneric();; - - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - //iterate - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)]) %(op) rhs_address[BroadcastedRightShape.GetOffset(current)]; - } while (incr.Next() != null); - - return ret; - } - - %foreach except(supported_dtypes, "Boolean"), except(supported_dtypes_lowercase, "bool")% - case NPTypeCode.#1: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(((*((bool*)lhs.Address) ? 1 : 0) #(op) *((#2*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = ((lhs_address[BroadcastedLeftShape.GetOffset(current)] ? 1 : 0) #(op) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((bool*)lhs.Address) == (*((bool*)rhs.Address)))).MakeGeneric();; - - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - //iterate - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)]) == rhs_address[BroadcastedRightShape.GetOffset(current)]; - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Byte: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(((*((bool*)lhs.Address) ? 1 : 0) == *((byte*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = ((lhs_address[BroadcastedLeftShape.GetOffset(current)] ? 1 : 0) == rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Int16: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(((*((bool*)lhs.Address) ? 1 : 0) == *((short*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = ((lhs_address[BroadcastedLeftShape.GetOffset(current)] ? 1 : 0) == rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.UInt16: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(((*((bool*)lhs.Address) ? 1 : 0) == *((ushort*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = ((lhs_address[BroadcastedLeftShape.GetOffset(current)] ? 1 : 0) == rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Int32: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(((*((bool*)lhs.Address) ? 1 : 0) == *((int*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = ((lhs_address[BroadcastedLeftShape.GetOffset(current)] ? 1 : 0) == rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.UInt32: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(((*((bool*)lhs.Address) ? 1 : 0) == *((uint*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = ((lhs_address[BroadcastedLeftShape.GetOffset(current)] ? 1 : 0) == rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Int64: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(((*((bool*)lhs.Address) ? 1 : 0) == *((long*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = ((lhs_address[BroadcastedLeftShape.GetOffset(current)] ? 1 : 0) == rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.UInt64: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(((*((bool*)lhs.Address) ? 1ul : 0ul) == *((ulong*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = ((lhs_address[BroadcastedLeftShape.GetOffset(current)] ? 1ul : 0) == rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Char: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(((*((bool*)lhs.Address) ? 1 : 0) == *((char*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = ((lhs_address[BroadcastedLeftShape.GetOffset(current)] ? 1 : 0) == rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Double: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(((*((bool*)lhs.Address) ? 1 : 0) == *((double*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = ((lhs_address[BroadcastedLeftShape.GetOffset(current)] ? 1 : 0) == rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Single: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(((*((bool*)lhs.Address) ? 1 : 0) == *((float*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = ((lhs_address[BroadcastedLeftShape.GetOffset(current)] ? 1 : 0) == rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Decimal: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar(((*((bool*)lhs.Address) ? 1 : 0) == *((decimal*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (bool*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = ((lhs_address[BroadcastedLeftShape.GetOffset(current)] ? 1 : 0) == rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.Byte.cs b/src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.Byte.cs deleted file mode 100644 index d856fec7..00000000 --- a/src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.Byte.cs +++ /dev/null @@ -1,349 +0,0 @@ -//Generated by Regex Templating Engine at 21/07/2019 23:20:20 UTC -//template source: C:\Users\Eli-PC\Desktop\SciSharp\NumSharp\src\NumSharp.Core\Operations\Elementwise\Templates\Default.Op.Equals.template.cs - -using System; -using System.Diagnostics.CodeAnalysis; -using System.Runtime.CompilerServices; -using NumSharp.Generic; -using NumSharp.Utilities; - -namespace NumSharp.Backends -{ - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray EqualsByte(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of byte - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "==" - %op_bool = "==" - case NPTypeCode.Boolean: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((byte*)lhs.Address) %(op) (*((bool*)rhs.Address) ? (byte) 1 : (byte) 0))).MakeGeneric();; - - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - //iterate - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)]) %(op_bool) 0 != rhs_address[BroadcastedRightShape.GetOffset(current)]; - } while (incr.Next() != null); - - return ret; - } - - %foreach except(supported_dtypes, "Boolean"), except(supported_dtypes_lowercase, "bool")% - case NPTypeCode.#1: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((byte*)lhs.Address) #(op) *((#2*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] #(op) (byte) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((byte*)lhs.Address) == (*((bool*)rhs.Address) ? (byte) 1 : (byte) 0))).MakeGeneric();; - - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - //iterate - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)]) == 0 != rhs_address[BroadcastedRightShape.GetOffset(current)]; - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Byte: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((byte*)lhs.Address) == *((byte*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (byte) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Int16: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((byte*)lhs.Address) == *((short*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (byte) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.UInt16: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((byte*)lhs.Address) == *((ushort*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (byte) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Int32: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((byte*)lhs.Address) == *((int*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (byte) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.UInt32: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((byte*)lhs.Address) == *((uint*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (byte) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Int64: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((byte*)lhs.Address) == *((long*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (byte) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.UInt64: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((byte*)lhs.Address) == *((ulong*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (byte) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Char: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((byte*)lhs.Address) == *((char*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (byte) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Double: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((byte*)lhs.Address) == *((double*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (byte) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Single: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((byte*)lhs.Address) == *((float*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (byte) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Decimal: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((byte*)lhs.Address) == *((decimal*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (byte*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (byte) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.Char.cs b/src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.Char.cs deleted file mode 100644 index 0dd8b978..00000000 --- a/src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.Char.cs +++ /dev/null @@ -1,349 +0,0 @@ -//Generated by Regex Templating Engine at 21/07/2019 23:20:20 UTC -//template source: C:\Users\Eli-PC\Desktop\SciSharp\NumSharp\src\NumSharp.Core\Operations\Elementwise\Templates\Default.Op.Equals.template.cs - -using System; -using System.Diagnostics.CodeAnalysis; -using System.Runtime.CompilerServices; -using NumSharp.Generic; -using NumSharp.Utilities; - -namespace NumSharp.Backends -{ - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray EqualsChar(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of char - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "==" - %op_bool = "==" - case NPTypeCode.Boolean: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((char*)lhs.Address) %(op) (*((bool*)rhs.Address) ? (char) 1 : (char) 0))).MakeGeneric();; - - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - //iterate - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)]) %(op_bool) 0 != rhs_address[BroadcastedRightShape.GetOffset(current)]; - } while (incr.Next() != null); - - return ret; - } - - %foreach except(supported_dtypes, "Boolean"), except(supported_dtypes_lowercase, "bool")% - case NPTypeCode.#1: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((char*)lhs.Address) #(op) *((#2*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] #(op) (char) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((char*)lhs.Address) == (*((bool*)rhs.Address) ? (char) 1 : (char) 0))).MakeGeneric();; - - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - //iterate - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)]) == 0 != rhs_address[BroadcastedRightShape.GetOffset(current)]; - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Byte: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((char*)lhs.Address) == *((byte*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (char) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Int16: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((char*)lhs.Address) == *((short*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (char) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.UInt16: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((char*)lhs.Address) == *((ushort*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (char) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Int32: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((char*)lhs.Address) == *((int*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (char) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.UInt32: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((char*)lhs.Address) == *((uint*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (char) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Int64: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((char*)lhs.Address) == *((long*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (char) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.UInt64: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((char*)lhs.Address) == *((ulong*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (char) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Char: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((char*)lhs.Address) == *((char*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (char) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Double: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((char*)lhs.Address) == *((double*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (char) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Single: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((char*)lhs.Address) == *((float*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (char) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Decimal: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((char*)lhs.Address) == *((decimal*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (char*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (char) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.Decimal.cs b/src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.Decimal.cs deleted file mode 100644 index fc01a829..00000000 --- a/src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.Decimal.cs +++ /dev/null @@ -1,349 +0,0 @@ -//Generated by Regex Templating Engine at 21/07/2019 23:20:20 UTC -//template source: C:\Users\Eli-PC\Desktop\SciSharp\NumSharp\src\NumSharp.Core\Operations\Elementwise\Templates\Default.Op.Equals.template.cs - -using System; -using System.Diagnostics.CodeAnalysis; -using System.Runtime.CompilerServices; -using NumSharp.Generic; -using NumSharp.Utilities; - -namespace NumSharp.Backends -{ - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray EqualsDecimal(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of decimal - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "==" - %op_bool = "==" - case NPTypeCode.Boolean: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((decimal*)lhs.Address) %(op) (*((bool*)rhs.Address) ? (decimal) 1 : (decimal) 0))).MakeGeneric();; - - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - //iterate - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)]) %(op_bool) 0 != rhs_address[BroadcastedRightShape.GetOffset(current)]; - } while (incr.Next() != null); - - return ret; - } - - %foreach except(supported_dtypes, "Boolean"), except(supported_dtypes_lowercase, "bool")% - case NPTypeCode.#1: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((decimal*)lhs.Address) #(op) *((#2*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] #(op) (decimal) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((decimal*)lhs.Address) == (*((bool*)rhs.Address) ? (decimal) 1 : (decimal) 0))).MakeGeneric();; - - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - //iterate - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)]) == 0 != rhs_address[BroadcastedRightShape.GetOffset(current)]; - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Byte: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((decimal*)lhs.Address) == *((byte*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (decimal) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Int16: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((decimal*)lhs.Address) == *((short*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (decimal) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.UInt16: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((decimal*)lhs.Address) == *((ushort*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (decimal) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Int32: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((decimal*)lhs.Address) == *((int*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (decimal) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.UInt32: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((decimal*)lhs.Address) == *((uint*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (decimal) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Int64: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((decimal*)lhs.Address) == *((long*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (decimal) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.UInt64: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((decimal*)lhs.Address) == *((ulong*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (decimal) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Char: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((decimal*)lhs.Address) == *((char*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (decimal) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Double: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((decimal*)lhs.Address) == (decimal) *((double*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (decimal) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Single: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((decimal*)lhs.Address) == (decimal) *((float*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (decimal) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Decimal: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((decimal*)lhs.Address) == *((decimal*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (decimal*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (decimal) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.Double.cs b/src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.Double.cs deleted file mode 100644 index 249abdd8..00000000 --- a/src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.Double.cs +++ /dev/null @@ -1,349 +0,0 @@ -//Generated by Regex Templating Engine at 21/07/2019 23:20:20 UTC -//template source: C:\Users\Eli-PC\Desktop\SciSharp\NumSharp\src\NumSharp.Core\Operations\Elementwise\Templates\Default.Op.Equals.template.cs - -using System; -using System.Diagnostics.CodeAnalysis; -using System.Runtime.CompilerServices; -using NumSharp.Generic; -using NumSharp.Utilities; - -namespace NumSharp.Backends -{ - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray EqualsDouble(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of double - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "==" - %op_bool = "==" - case NPTypeCode.Boolean: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((double*)lhs.Address) %(op) (*((bool*)rhs.Address) ? (double) 1 : (double) 0))).MakeGeneric();; - - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - //iterate - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)]) %(op_bool) 0 != rhs_address[BroadcastedRightShape.GetOffset(current)]; - } while (incr.Next() != null); - - return ret; - } - - %foreach except(supported_dtypes, "Boolean"), except(supported_dtypes_lowercase, "bool")% - case NPTypeCode.#1: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((double*)lhs.Address) #(op) *((#2*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] #(op) (double) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((double*)lhs.Address) == (*((bool*)rhs.Address) ? (double) 1 : (double) 0))).MakeGeneric();; - - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - //iterate - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)]) == 0 != rhs_address[BroadcastedRightShape.GetOffset(current)]; - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Byte: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((double*)lhs.Address) == *((byte*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (double) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Int16: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((double*)lhs.Address) == *((short*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (double) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.UInt16: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((double*)lhs.Address) == *((ushort*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (double) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Int32: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((double*)lhs.Address) == *((int*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (double) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.UInt32: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((double*)lhs.Address) == *((uint*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (double) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Int64: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((double*)lhs.Address) == *((long*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (double) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.UInt64: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((double*)lhs.Address) == *((ulong*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (double) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Char: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((double*)lhs.Address) == *((char*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (double) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Double: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((double*)lhs.Address) == *((double*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (double) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Single: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((double*)lhs.Address) == *((float*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (double) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Decimal: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((double*)lhs.Address) == (double) *((decimal*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (double*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (double) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.Int16.cs b/src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.Int16.cs deleted file mode 100644 index 350688ef..00000000 --- a/src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.Int16.cs +++ /dev/null @@ -1,349 +0,0 @@ -//Generated by Regex Templating Engine at 21/07/2019 23:20:20 UTC -//template source: C:\Users\Eli-PC\Desktop\SciSharp\NumSharp\src\NumSharp.Core\Operations\Elementwise\Templates\Default.Op.Equals.template.cs - -using System; -using System.Diagnostics.CodeAnalysis; -using System.Runtime.CompilerServices; -using NumSharp.Generic; -using NumSharp.Utilities; - -namespace NumSharp.Backends -{ - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray EqualsInt16(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of short - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "==" - %op_bool = "==" - case NPTypeCode.Boolean: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((short*)lhs.Address) %(op) (*((bool*)rhs.Address) ? (short) 1 : (short) 0))).MakeGeneric();; - - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - //iterate - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)]) %(op_bool) 0 != rhs_address[BroadcastedRightShape.GetOffset(current)]; - } while (incr.Next() != null); - - return ret; - } - - %foreach except(supported_dtypes, "Boolean"), except(supported_dtypes_lowercase, "bool")% - case NPTypeCode.#1: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((short*)lhs.Address) #(op) *((#2*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] #(op) (short) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((short*)lhs.Address) == (*((bool*)rhs.Address) ? (short) 1 : (short) 0))).MakeGeneric();; - - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - //iterate - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)]) == 0 != rhs_address[BroadcastedRightShape.GetOffset(current)]; - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Byte: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((short*)lhs.Address) == *((byte*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (short) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Int16: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((short*)lhs.Address) == *((short*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (short) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.UInt16: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((short*)lhs.Address) == *((ushort*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (short) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Int32: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((short*)lhs.Address) == *((int*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (short) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.UInt32: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((short*)lhs.Address) == *((uint*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (short) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Int64: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((short*)lhs.Address) == *((long*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (short) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.UInt64: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((short*)lhs.Address) == (int) *((ulong*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (short) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Char: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((short*)lhs.Address) == *((char*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (short) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Double: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((short*)lhs.Address) == *((double*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (short) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Single: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((short*)lhs.Address) == *((float*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (short) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Decimal: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((short*)lhs.Address) == *((decimal*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (short*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (short) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.Int32.cs b/src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.Int32.cs deleted file mode 100644 index 96cd351d..00000000 --- a/src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.Int32.cs +++ /dev/null @@ -1,349 +0,0 @@ -//Generated by Regex Templating Engine at 21/07/2019 23:20:20 UTC -//template source: C:\Users\Eli-PC\Desktop\SciSharp\NumSharp\src\NumSharp.Core\Operations\Elementwise\Templates\Default.Op.Equals.template.cs - -using System; -using System.Diagnostics.CodeAnalysis; -using System.Runtime.CompilerServices; -using NumSharp.Generic; -using NumSharp.Utilities; - -namespace NumSharp.Backends -{ - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray EqualsInt32(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of int - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "==" - %op_bool = "==" - case NPTypeCode.Boolean: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((int*)lhs.Address) %(op) (*((bool*)rhs.Address) ? (int) 1 : (int) 0))).MakeGeneric();; - - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - //iterate - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)]) %(op_bool) 0 != rhs_address[BroadcastedRightShape.GetOffset(current)]; - } while (incr.Next() != null); - - return ret; - } - - %foreach except(supported_dtypes, "Boolean"), except(supported_dtypes_lowercase, "bool")% - case NPTypeCode.#1: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((int*)lhs.Address) #(op) *((#2*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] #(op) (int) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((int*)lhs.Address) == (*((bool*)rhs.Address) ? (int) 1 : (int) 0))).MakeGeneric();; - - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - //iterate - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)]) == 0 != rhs_address[BroadcastedRightShape.GetOffset(current)]; - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Byte: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((int*)lhs.Address) == *((byte*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (int) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Int16: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((int*)lhs.Address) == *((short*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (int) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.UInt16: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((int*)lhs.Address) == *((ushort*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (int) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Int32: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((int*)lhs.Address) == *((int*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (int) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.UInt32: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((int*)lhs.Address) == *((uint*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (int) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Int64: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((int*)lhs.Address) == *((long*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (int) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.UInt64: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((int*)lhs.Address) == (int) *((ulong*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (int) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Char: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((int*)lhs.Address) == *((char*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (int) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Double: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((int*)lhs.Address) == *((double*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (int) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Single: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((int*)lhs.Address) == *((float*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (int) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Decimal: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((int*)lhs.Address) == *((decimal*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (int*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (int) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.Int64.cs b/src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.Int64.cs deleted file mode 100644 index 52989de6..00000000 --- a/src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.Int64.cs +++ /dev/null @@ -1,349 +0,0 @@ -//Generated by Regex Templating Engine at 21/07/2019 23:20:20 UTC -//template source: C:\Users\Eli-PC\Desktop\SciSharp\NumSharp\src\NumSharp.Core\Operations\Elementwise\Templates\Default.Op.Equals.template.cs - -using System; -using System.Diagnostics.CodeAnalysis; -using System.Runtime.CompilerServices; -using NumSharp.Generic; -using NumSharp.Utilities; - -namespace NumSharp.Backends -{ - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray EqualsInt64(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of long - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "==" - %op_bool = "==" - case NPTypeCode.Boolean: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((long*)lhs.Address) %(op) (*((bool*)rhs.Address) ? (long) 1 : (long) 0))).MakeGeneric();; - - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - //iterate - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)]) %(op_bool) 0 != rhs_address[BroadcastedRightShape.GetOffset(current)]; - } while (incr.Next() != null); - - return ret; - } - - %foreach except(supported_dtypes, "Boolean"), except(supported_dtypes_lowercase, "bool")% - case NPTypeCode.#1: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((long*)lhs.Address) #(op) *((#2*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] #(op) (long) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((long*)lhs.Address) == (*((bool*)rhs.Address) ? (long) 1 : (long) 0))).MakeGeneric();; - - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - //iterate - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)]) == 0 != rhs_address[BroadcastedRightShape.GetOffset(current)]; - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Byte: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((long*)lhs.Address) == *((byte*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (long) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Int16: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((long*)lhs.Address) == *((short*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (long) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.UInt16: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((long*)lhs.Address) == *((ushort*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (long) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Int32: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((long*)lhs.Address) == *((int*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (long) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.UInt32: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((long*)lhs.Address) == *((uint*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (long) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Int64: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((long*)lhs.Address) == *((long*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (long) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.UInt64: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((long*)lhs.Address) == (long) *((ulong*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (long) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Char: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((long*)lhs.Address) == *((char*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (long) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Double: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((long*)lhs.Address) == *((double*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (long) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Single: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((long*)lhs.Address) == *((float*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (long) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Decimal: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((long*)lhs.Address) == *((decimal*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (long*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (long) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.Single.cs b/src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.Single.cs deleted file mode 100644 index 21acc01b..00000000 --- a/src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.Single.cs +++ /dev/null @@ -1,349 +0,0 @@ -//Generated by Regex Templating Engine at 21/07/2019 23:20:20 UTC -//template source: C:\Users\Eli-PC\Desktop\SciSharp\NumSharp\src\NumSharp.Core\Operations\Elementwise\Templates\Default.Op.Equals.template.cs - -using System; -using System.Diagnostics.CodeAnalysis; -using System.Runtime.CompilerServices; -using NumSharp.Generic; -using NumSharp.Utilities; - -namespace NumSharp.Backends -{ - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray EqualsSingle(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of float - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "==" - %op_bool = "==" - case NPTypeCode.Boolean: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((float*)lhs.Address) %(op) (*((bool*)rhs.Address) ? (float) 1 : (float) 0))).MakeGeneric();; - - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - //iterate - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)]) %(op_bool) 0 != rhs_address[BroadcastedRightShape.GetOffset(current)]; - } while (incr.Next() != null); - - return ret; - } - - %foreach except(supported_dtypes, "Boolean"), except(supported_dtypes_lowercase, "bool")% - case NPTypeCode.#1: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((float*)lhs.Address) #(op) *((#2*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] #(op) (float) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((float*)lhs.Address) == (*((bool*)rhs.Address) ? (float) 1 : (float) 0))).MakeGeneric();; - - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - //iterate - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)]) == 0 != rhs_address[BroadcastedRightShape.GetOffset(current)]; - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Byte: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((float*)lhs.Address) == *((byte*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (float) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Int16: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((float*)lhs.Address) == *((short*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (float) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.UInt16: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((float*)lhs.Address) == *((ushort*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (float) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Int32: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((float*)lhs.Address) == *((int*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (float) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.UInt32: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((float*)lhs.Address) == *((uint*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (float) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Int64: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((float*)lhs.Address) == *((long*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (float) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.UInt64: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((float*)lhs.Address) == *((ulong*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (float) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Char: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((float*)lhs.Address) == *((char*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (float) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Double: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((float*)lhs.Address) == *((double*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (float) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Single: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((float*)lhs.Address) == *((float*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (float) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Decimal: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((float*)lhs.Address) == (double) *((decimal*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (float*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (float) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.UInt16.cs b/src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.UInt16.cs deleted file mode 100644 index 19fbd270..00000000 --- a/src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.UInt16.cs +++ /dev/null @@ -1,349 +0,0 @@ -//Generated by Regex Templating Engine at 21/07/2019 23:20:20 UTC -//template source: C:\Users\Eli-PC\Desktop\SciSharp\NumSharp\src\NumSharp.Core\Operations\Elementwise\Templates\Default.Op.Equals.template.cs - -using System; -using System.Diagnostics.CodeAnalysis; -using System.Runtime.CompilerServices; -using NumSharp.Generic; -using NumSharp.Utilities; - -namespace NumSharp.Backends -{ - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray EqualsUInt16(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of ushort - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "==" - %op_bool = "==" - case NPTypeCode.Boolean: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((ushort*)lhs.Address) %(op) (*((bool*)rhs.Address) ? (ushort) 1 : (ushort) 0))).MakeGeneric();; - - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - //iterate - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)]) %(op_bool) 0 != rhs_address[BroadcastedRightShape.GetOffset(current)]; - } while (incr.Next() != null); - - return ret; - } - - %foreach except(supported_dtypes, "Boolean"), except(supported_dtypes_lowercase, "bool")% - case NPTypeCode.#1: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((ushort*)lhs.Address) #(op) *((#2*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] #(op) (ushort) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((ushort*)lhs.Address) == (*((bool*)rhs.Address) ? (ushort) 1 : (ushort) 0))).MakeGeneric();; - - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - //iterate - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)]) == 0 != rhs_address[BroadcastedRightShape.GetOffset(current)]; - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Byte: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((ushort*)lhs.Address) == *((byte*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (ushort) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Int16: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((ushort*)lhs.Address) == *((short*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (ushort) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.UInt16: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((ushort*)lhs.Address) == *((ushort*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (ushort) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Int32: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((ushort*)lhs.Address) == *((int*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (ushort) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.UInt32: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((ushort*)lhs.Address) == *((uint*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (ushort) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Int64: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((ushort*)lhs.Address) == *((long*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (ushort) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.UInt64: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((ushort*)lhs.Address) == *((ulong*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (ushort) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Char: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((ushort*)lhs.Address) == *((char*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (ushort) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Double: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((ushort*)lhs.Address) == *((double*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (ushort) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Single: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((ushort*)lhs.Address) == *((float*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (ushort) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Decimal: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((ushort*)lhs.Address) == *((decimal*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ushort*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (ushort) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.UInt32.cs b/src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.UInt32.cs deleted file mode 100644 index 284f134d..00000000 --- a/src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.UInt32.cs +++ /dev/null @@ -1,349 +0,0 @@ -//Generated by Regex Templating Engine at 21/07/2019 23:20:20 UTC -//template source: C:\Users\Eli-PC\Desktop\SciSharp\NumSharp\src\NumSharp.Core\Operations\Elementwise\Templates\Default.Op.Equals.template.cs - -using System; -using System.Diagnostics.CodeAnalysis; -using System.Runtime.CompilerServices; -using NumSharp.Generic; -using NumSharp.Utilities; - -namespace NumSharp.Backends -{ - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray EqualsUInt32(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of uint - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "==" - %op_bool = "==" - case NPTypeCode.Boolean: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((uint*)lhs.Address) %(op) (*((bool*)rhs.Address) ? (uint) 1 : (uint) 0))).MakeGeneric();; - - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - //iterate - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)]) %(op_bool) 0 != rhs_address[BroadcastedRightShape.GetOffset(current)]; - } while (incr.Next() != null); - - return ret; - } - - %foreach except(supported_dtypes, "Boolean"), except(supported_dtypes_lowercase, "bool")% - case NPTypeCode.#1: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((uint*)lhs.Address) #(op) *((#2*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] #(op) (uint) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((uint*)lhs.Address) == (*((bool*)rhs.Address) ? (uint) 1 : (uint) 0))).MakeGeneric();; - - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - //iterate - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)]) == 0 != rhs_address[BroadcastedRightShape.GetOffset(current)]; - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Byte: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((uint*)lhs.Address) == *((byte*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (uint) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Int16: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((uint*)lhs.Address) == *((short*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (uint) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.UInt16: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((uint*)lhs.Address) == *((ushort*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (uint) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Int32: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((uint*)lhs.Address) == *((int*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (uint) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.UInt32: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((uint*)lhs.Address) == *((uint*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (uint) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Int64: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((uint*)lhs.Address) == *((long*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (uint) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.UInt64: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((uint*)lhs.Address) == *((ulong*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (uint) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Char: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((uint*)lhs.Address) == *((char*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (uint) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Double: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((uint*)lhs.Address) == *((double*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (uint) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Single: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((uint*)lhs.Address) == *((float*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (uint) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Decimal: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((uint*)lhs.Address) == *((decimal*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (uint*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (uint) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.UInt64.cs b/src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.UInt64.cs deleted file mode 100644 index dab08961..00000000 --- a/src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.UInt64.cs +++ /dev/null @@ -1,349 +0,0 @@ -//Generated by Regex Templating Engine at 21/07/2019 23:20:20 UTC -//template source: C:\Users\Eli-PC\Desktop\SciSharp\NumSharp\src\NumSharp.Core\Operations\Elementwise\Templates\Default.Op.Equals.template.cs - -using System; -using System.Diagnostics.CodeAnalysis; -using System.Runtime.CompilerServices; -using NumSharp.Generic; -using NumSharp.Utilities; - -namespace NumSharp.Backends -{ - public partial class DefaultEngine - { - [MethodImpl(OptimizeAndInline)] - [SuppressMessage("ReSharper", "JoinDeclarationAndInitializer")] - [SuppressMessage("ReSharper", "CompareOfFloatsByEqualityOperator")] - public unsafe NDArray EqualsUInt64(in NDArray lhs, in NDArray rhs) - { - //lhs is NDArray of ulong - switch (rhs.GetTypeCode) - { -#if _REGEN - %op = "==" - %op_bool = "==" - case NPTypeCode.Boolean: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((ulong*)lhs.Address) %(op) (*((bool*)rhs.Address) ? (ulong) 1 : (ulong) 0))).MakeGeneric();; - - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - //iterate - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)]) %(op_bool) 0 != rhs_address[BroadcastedRightShape.GetOffset(current)]; - } while (incr.Next() != null); - - return ret; - } - - %foreach except(supported_dtypes, "Boolean"), except(supported_dtypes_lowercase, "bool")% - case NPTypeCode.#1: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((ulong*)lhs.Address) #(op) *((#2*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (#2*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] #(op) (ulong) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - % - default: - throw new NotSupportedException(); -#else - - case NPTypeCode.Boolean: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((ulong*)lhs.Address) == (*((bool*)rhs.Address) ? (ulong) 1 : (ulong) 0))).MakeGeneric();; - - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (bool*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - //iterate - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)]) == 0 != rhs_address[BroadcastedRightShape.GetOffset(current)]; - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Byte: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((ulong*)lhs.Address) == *((byte*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (byte*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (ulong) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Int16: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((ulong*)lhs.Address) == (ulong) *((short*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (short*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (ulong) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.UInt16: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((ulong*)lhs.Address) == *((ushort*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (ushort*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (ulong) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Int32: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((ulong*)lhs.Address) == (ulong) *((int*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (int*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (ulong) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.UInt32: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((ulong*)lhs.Address) == *((uint*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (uint*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (ulong) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Int64: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((ulong*)lhs.Address) == (ulong) *((long*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (long*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (ulong) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.UInt64: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((ulong*)lhs.Address) == *((ulong*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (ulong*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (ulong) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Char: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((ulong*)lhs.Address) == *((char*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (char*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (ulong) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Double: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((ulong*)lhs.Address) == *((double*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (double*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (ulong) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Single: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((ulong*)lhs.Address) == *((float*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (float*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (ulong) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - case NPTypeCode.Decimal: - { - //if return type is scalar - if (lhs.Shape.IsScalar && rhs.Shape.IsScalar) - return NDArray.Scalar((*((ulong*)lhs.Address) == *((decimal*)rhs.Address))).MakeGeneric(); - (Shape BroadcastedLeftShape, Shape BroadcastedRightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape); - var lhs_address = (ulong*)lhs.Address; - var rhs_address = (decimal*)rhs.Address; - var ret = new NDArray(new Shape(BroadcastedLeftShape.dimensions), true); - Shape retShape = ret.Shape; - - var ret_address = (bool*)ret.Address; - var incr = new ValueCoordinatesIncrementor(BroadcastedLeftShape.dimensions); //doesn't matter which side it is. - int[] current = incr.Index; - do - { - ret_address[retShape.GetOffset(current)] = (lhs_address[BroadcastedLeftShape.GetOffset(current)] == (ulong) rhs_address[BroadcastedRightShape.GetOffset(current)]); - } while (incr.Next() != null); - - return ret; - } - - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.cs b/src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.cs deleted file mode 100644 index 3f65ec2a..00000000 --- a/src/NumSharp.Core/Operations/Elementwise/Equals/Default.Equals.cs +++ /dev/null @@ -1,41 +0,0 @@ -#if _REGEN_TEMPLATE -%template "./Add/Default.Add.#1.cs" for every supported_dtypes, supported_dtypes_lowercase -#endif - -using System; -using NumSharp.Generic; - -namespace NumSharp.Backends -{ - public partial class DefaultEngine - { - public override NDArray Compare(in NDArray x, in NDArray y) - { - switch (x.GetTypeCode) - { -#if _REGEN - %foreach supported_dtypes,supported_dtypes_lowercase% - case NPTypeCode.#1: return Equals#1(x,y); - % - default: - throw new NotSupportedException(); -#else - case NPTypeCode.Boolean: return EqualsBoolean(x,y); - case NPTypeCode.Byte: return EqualsByte(x,y); - case NPTypeCode.Int16: return EqualsInt16(x,y); - case NPTypeCode.UInt16: return EqualsUInt16(x,y); - case NPTypeCode.Int32: return EqualsInt32(x,y); - case NPTypeCode.UInt32: return EqualsUInt32(x,y); - case NPTypeCode.Int64: return EqualsInt64(x,y); - case NPTypeCode.UInt64: return EqualsUInt64(x,y); - case NPTypeCode.Char: return EqualsChar(x,y); - case NPTypeCode.Double: return EqualsDouble(x,y); - case NPTypeCode.Single: return EqualsSingle(x,y); - case NPTypeCode.Decimal: return EqualsDecimal(x,y); - default: - throw new NotSupportedException(); -#endif - } - } - } -} diff --git a/src/NumSharp.Core/Operations/Elementwise/NDArray.AND.cs b/src/NumSharp.Core/Operations/Elementwise/NDArray.AND.cs index a499466a..ce48c63e 100644 --- a/src/NumSharp.Core/Operations/Elementwise/NDArray.AND.cs +++ b/src/NumSharp.Core/Operations/Elementwise/NDArray.AND.cs @@ -1,36 +1,80 @@ -using NumSharp.Generic; - namespace NumSharp { public partial class NDArray { - public static NDArray operator &(NDArray lhs, NDArray rhs) + /// + /// Element-wise bitwise AND operation. + /// For boolean arrays: logical AND. + /// For integer arrays: bitwise AND. + /// Supports broadcasting. + /// + public static NDArray operator &(NDArray lhs, NDArray rhs) + { + return lhs.TensorEngine.BitwiseAnd(lhs, rhs); + } + + /// + /// Element-wise bitwise AND with scalar. + /// + public static NDArray operator &(NDArray lhs, byte rhs) { - return null; - //var boolTensor = new NDArray(typeof(bool),lhs.shape); - //bool[] bools = boolTensor.Storage.GetData(); + return lhs.TensorEngine.BitwiseAnd(lhs, Scalar(rhs)); + } - //bool[] np = lhs.Storage.GetData(); - //bool[] obj = rhs.Storage.GetData(); + /// + /// Element-wise bitwise AND with scalar. + /// + public static NDArray operator &(byte lhs, NDArray rhs) + { + return rhs.TensorEngine.BitwiseAnd(Scalar(lhs), rhs); + } - // for(int i = 0;i < bools.Length;i++) - // bools[i] = np[i] && obj[i]; + /// + /// Element-wise bitwise AND with scalar. + /// + public static NDArray operator &(NDArray lhs, int rhs) + { + return lhs.TensorEngine.BitwiseAnd(lhs, Scalar(rhs)); + } - //return boolTensor.MakeGeneric(); + /// + /// Element-wise bitwise AND with scalar. + /// + public static NDArray operator &(int lhs, NDArray rhs) + { + return rhs.TensorEngine.BitwiseAnd(Scalar(lhs), rhs); } - public static NDArray operator &(NDArray lhs, byte rhs) + /// + /// Element-wise bitwise AND with scalar. + /// + public static NDArray operator &(NDArray lhs, long rhs) { - return null; - //var result = new NDArray(typeof(byte), lhs.shape); - //byte[] resultBytes = result.Storage.GetData(); + return lhs.TensorEngine.BitwiseAnd(lhs, Scalar(rhs)); + } - //byte[] lhsValues = lhs.Storage.GetData(); + /// + /// Element-wise bitwise AND with scalar. + /// + public static NDArray operator &(long lhs, NDArray rhs) + { + return rhs.TensorEngine.BitwiseAnd(Scalar(lhs), rhs); + } - //for (int i = 0; i < resultBytes.Length; i++) - // resultBytes[i] = (byte)(lhsValues[i] & rhs); + /// + /// Element-wise bitwise AND with boolean scalar. + /// + public static NDArray operator &(NDArray lhs, bool rhs) + { + return lhs.TensorEngine.BitwiseAnd(lhs, Scalar(rhs)); + } - //return result.MakeGeneric(); + /// + /// Element-wise bitwise AND with boolean scalar. + /// + public static NDArray operator &(bool lhs, NDArray rhs) + { + return rhs.TensorEngine.BitwiseAnd(Scalar(lhs), rhs); } } } diff --git a/src/NumSharp.Core/Operations/Elementwise/NDArray.Equals.cs b/src/NumSharp.Core/Operations/Elementwise/NDArray.Equals.cs index f777f0b8..d8f76efc 100644 --- a/src/NumSharp.Core/Operations/Elementwise/NDArray.Equals.cs +++ b/src/NumSharp.Core/Operations/Elementwise/NDArray.Equals.cs @@ -1,4 +1,4 @@ -using System; +using System; using NumSharp.Generic; namespace NumSharp @@ -35,18 +35,53 @@ public override bool Equals(object obj) } } - public static NDArray operator ==(NDArray left, object right) + /// + /// Element-wise equal comparison (==). + /// Supports all 12 dtypes and broadcasting. + /// + public static NDArray operator ==(NDArray lhs, NDArray rhs) + { + if (lhs is null && rhs is null) + return Scalar(true).MakeGeneric(); + + if (lhs is null || rhs is null) + return Scalar(false).MakeGeneric(); + + if (lhs.Shape.IsEmpty || lhs.size == 0) + return Scalar(false).MakeGeneric(); + + return lhs.TensorEngine.Compare(lhs, rhs); + } + + /// + /// Element-wise equal comparison with scalar (==). + /// + public static NDArray operator ==(NDArray lhs, object rhs) { - if (right is null) - return Scalar(ReferenceEquals(left, null)).MakeGeneric(); + if (rhs is null) + return Scalar(ReferenceEquals(lhs, null)).MakeGeneric(); - if (left is null) + if (lhs is null) return Scalar(false).MakeGeneric(); - if (left.Shape.IsEmpty || left.size == 0) + if (lhs.Shape.IsEmpty || lhs.size == 0) + return Scalar(false).MakeGeneric(); + + return lhs == np.asanyarray(rhs); + } + + /// + /// Element-wise equal comparison with scalar on left (==). + /// + public static NDArray operator ==(object lhs, NDArray rhs) + { + if (lhs is null) + return Scalar(ReferenceEquals(rhs, null)).MakeGeneric(); + + if (rhs is null) return Scalar(false).MakeGeneric(); - return left.TensorEngine.Compare(left, np.asanyarray(right)); + return np.asanyarray(lhs) == rhs; } /// NumPy signature: numpy.equal(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature, extobj]) = diff --git a/src/NumSharp.Core/Operations/Elementwise/NDArray.Greater.cs b/src/NumSharp.Core/Operations/Elementwise/NDArray.Greater.cs index e2e6f29b..da3f8638 100644 --- a/src/NumSharp.Core/Operations/Elementwise/NDArray.Greater.cs +++ b/src/NumSharp.Core/Operations/Elementwise/NDArray.Greater.cs @@ -1,78 +1,81 @@ -using NumSharp.Utilities; +using NumSharp.Generic; namespace NumSharp { public partial class NDArray { - public static NumSharp.Generic.NDArray operator >(NDArray np, int obj) + /// + /// Element-wise greater-than comparison (>). + /// Supports all 12 dtypes and broadcasting. + /// + public static NDArray operator >(NDArray lhs, NDArray rhs) { - return (np > (System.Object)obj); + if (lhs is null || rhs is null) + return Scalar(false).MakeGeneric(); + + if (lhs.Shape.IsEmpty || lhs.size == 0) + return Scalar(false).MakeGeneric(); + + return lhs.TensorEngine.Greater(lhs, rhs); } - public static NumSharp.Generic.NDArray operator >(NDArray np, object obj) + /// + /// Element-wise greater-than comparison with scalar (>). + /// + public static NDArray operator >(NDArray lhs, object rhs) { - var boolTensor = new NDArray(typeof(bool),np.shape); - var bools = boolTensor.Storage.GetData(); + if (lhs is null) + return Scalar(false).MakeGeneric(); - var npValues = np.Storage.GetData(); + return lhs > np.asanyarray(rhs); + } + + /// + /// Element-wise greater-than comparison with scalar on left (>). + /// + public static NDArray operator >(object lhs, NDArray rhs) + { + if (rhs is null) + return Scalar(false).MakeGeneric(); + + return np.asanyarray(lhs) > rhs; + } + + /// + /// Element-wise greater-than-or-equal comparison (>=). + /// Supports all 12 dtypes and broadcasting. + /// + public static NDArray operator >=(NDArray lhs, NDArray rhs) + { + if (lhs is null || rhs is null) + return Scalar(false).MakeGeneric(); - switch (npValues.TypeCode) - { - case NPTypeCode.Int32: - { - int value = Converts.ToInt32(obj); - int idx = 0; - foreach (var npValue in npValues) - { - if ((int)npValue > value) - bools[idx] = true; - idx++; - } - break; - } - case NPTypeCode.Int64: - { - long value = Converts.ToInt64(obj); - int idx = 0; - foreach (var npValue in npValues) - { - if ((long)npValue > value) - bools[idx] = true; - idx++; - } - break; - } - case NPTypeCode.Float: - { - float value = Converts.ToSingle(obj); - int idx = 0; - foreach (var npValue in npValues) - { - if ((float)npValue > value) - bools[idx] = true; - idx++; - } - break; - } - case NPTypeCode.Double: - { - double value = Converts.ToDouble(obj); - int idx = 0; - foreach (var npValue in npValues) - { - if ((double)npValue > value) - bools[idx] = true; - idx++; - } - break; - } - default : - { - throw new IncorrectTypeException(); - } - } + if (lhs.Shape.IsEmpty || lhs.size == 0) + return Scalar(false).MakeGeneric(); + + return lhs.TensorEngine.GreaterEqual(lhs, rhs); + } + + /// + /// Element-wise greater-than-or-equal comparison with scalar (>=). + /// + public static NDArray operator >=(NDArray lhs, object rhs) + { + if (lhs is null) + return Scalar(false).MakeGeneric(); + + return lhs >= np.asanyarray(rhs); + } + + /// + /// Element-wise greater-than-or-equal comparison with scalar on left (>=). + /// + public static NDArray operator >=(object lhs, NDArray rhs) + { + if (rhs is null) + return Scalar(false).MakeGeneric(); - return boolTensor.MakeGeneric(); + return np.asanyarray(lhs) >= rhs; } } } diff --git a/src/NumSharp.Core/Operations/Elementwise/NDArray.Lower.cs b/src/NumSharp.Core/Operations/Elementwise/NDArray.Lower.cs index 76f4c345..3a013753 100644 --- a/src/NumSharp.Core/Operations/Elementwise/NDArray.Lower.cs +++ b/src/NumSharp.Core/Operations/Elementwise/NDArray.Lower.cs @@ -1,78 +1,81 @@ -using NumSharp.Utilities; +using NumSharp.Generic; namespace NumSharp { public partial class NDArray { - public static NumSharp.Generic.NDArray operator <(NDArray np, int obj) + /// + /// Element-wise less-than comparison (<). + /// Supports all 12 dtypes and broadcasting. + /// + public static NDArray operator <(NDArray lhs, NDArray rhs) { - return (np < (System.Object)obj); + if (lhs is null || rhs is null) + return Scalar(false).MakeGeneric(); + + if (lhs.Shape.IsEmpty || lhs.size == 0) + return Scalar(false).MakeGeneric(); + + return lhs.TensorEngine.Less(lhs, rhs); + } + + /// + /// Element-wise less-than comparison with scalar (<). + /// + public static NDArray operator <(NDArray lhs, object rhs) + { + if (lhs is null) + return Scalar(false).MakeGeneric(); + + return lhs < np.asanyarray(rhs); + } + + /// + /// Element-wise less-than comparison with scalar on left (<). + /// + public static NDArray operator <(object lhs, NDArray rhs) + { + if (rhs is null) + return Scalar(false).MakeGeneric(); + + return np.asanyarray(lhs) < rhs; } - public static NumSharp.Generic.NDArray operator <(NDArray np, object obj) + /// + /// Element-wise less-than-or-equal comparison (<=). + /// Supports all 12 dtypes and broadcasting. + /// + public static NDArray operator <=(NDArray lhs, NDArray rhs) { - var boolTensor = new NDArray(typeof(bool),np.shape); - var bools = boolTensor.Storage.GetData(); + if (lhs is null || rhs is null) + return Scalar(false).MakeGeneric(); + + if (lhs.Shape.IsEmpty || lhs.size == 0) + return Scalar(false).MakeGeneric(); - var npValues = np.Storage.GetData(); - - switch (npValues.TypeCode) - { - case NPTypeCode.Int32: - { - int value = Converts.ToInt32(obj); - int idx = 0; - foreach (var npValue in npValues) - { - if ((int)npValue < value) - bools[idx] = true; - idx++; - } - break; - } - case NPTypeCode.Int64: - { - long value = Converts.ToInt64(obj); - int idx = 0; - foreach (var npValue in npValues) - { - if ((long)npValue < value) - bools[idx] = true; - idx++; - } - break; - } - case NPTypeCode.Float: - { - float value = Converts.ToSingle(obj); - int idx = 0; - foreach (var npValue in npValues) - { - if ((float)npValue < value) - bools[idx] = true; - idx++; - } - break; - } - case NPTypeCode.Double: - { - double value = Converts.ToDouble(obj); - int idx = 0; - foreach (var npValue in npValues) - { - if ((double)npValue < value) - bools[idx] = true; - idx++; - } - break; - } - default : - { - throw new IncorrectTypeException(); - } - } + return lhs.TensorEngine.LessEqual(lhs, rhs); + } + + /// + /// Element-wise less-than-or-equal comparison with scalar (<=). + /// + public static NDArray operator <=(NDArray lhs, object rhs) + { + if (lhs is null) + return Scalar(false).MakeGeneric(); + + return lhs <= np.asanyarray(rhs); + } + + /// + /// Element-wise less-than-or-equal comparison with scalar on left (<=). + /// + public static NDArray operator <=(object lhs, NDArray rhs) + { + if (rhs is null) + return Scalar(false).MakeGeneric(); - return boolTensor.MakeGeneric(); + return np.asanyarray(lhs) <= rhs; } } } diff --git a/src/NumSharp.Core/Operations/Elementwise/NDArray.NotEquals.cs b/src/NumSharp.Core/Operations/Elementwise/NDArray.NotEquals.cs index 47e4f300..811f946f 100644 --- a/src/NumSharp.Core/Operations/Elementwise/NDArray.NotEquals.cs +++ b/src/NumSharp.Core/Operations/Elementwise/NDArray.NotEquals.cs @@ -1,93 +1,53 @@ -using NumSharp.Utilities; +using NumSharp.Generic; namespace NumSharp { public partial class NDArray { - public static NumSharp.Generic.NDArray operator !=(NDArray np, object obj) + /// + /// Element-wise not-equal comparison (!=). + /// Supports all 12 dtypes and broadcasting. + /// + public static NDArray operator !=(NDArray lhs, NDArray rhs) { - var boolTensor = new NDArray(typeof(bool), np.shape); - var bools = boolTensor.Storage.GetData(); + if (lhs is null && rhs is null) + return Scalar(false).MakeGeneric(); - var npValues = np.Storage.GetData(); + if (lhs is null || rhs is null) + return Scalar(true).MakeGeneric(); - switch (npValues.TypeCode) - { - case NPTypeCode.Int32: - { - int value = Converts.ToInt32(obj); - int idx = 0; - foreach (var npValue in npValues) - { - if ((int)npValue != value) - bools[idx] = true; - idx++; - } - break; - } - case NPTypeCode.Int64: - { - long value = Converts.ToInt64(obj); - int idx = 0; - foreach (var npValue in npValues) - { - if ((long)npValue != value) - bools[idx] = true; - idx++; - } - break; - } - case NPTypeCode.Float: - { - float value = Converts.ToSingle(obj); - int idx = 0; - foreach (var npValue in npValues) - { - if ((float)npValue != value) - bools[idx] = true; - idx++; - } - break; - } - case NPTypeCode.Double: - { - double value = Converts.ToDouble(obj); - int idx = 0; - foreach (var npValue in npValues) - { - if ((double)npValue != value) - bools[idx] = true; - idx++; - } - break; - } - /*case Complex[] values : - { - Complex value = (Complex) obj; - for(int idx =0; idx < bools.Length;idx++) - { - if ( values[idx] != value ) - bools[idx] = true; - } - break; - }*/ - /*case Quaternion[] values : - { - Quaternion value = (Quaternion) obj; - for(int idx =0; idx < bools.Length;idx++) - { - if ( values[idx] != value ) - bools[idx] = true; - } - break; - }*/ - default: - { - throw new IncorrectTypeException(); - } - } + if (lhs.Shape.IsEmpty || lhs.size == 0) + return Scalar(true).MakeGeneric(); - return boolTensor.MakeGeneric(); + return lhs.TensorEngine.NotEqual(lhs, rhs); + } + + /// + /// Element-wise not-equal comparison with scalar (!=). + /// + public static NDArray operator !=(NDArray lhs, object rhs) + { + if (lhs is null) + return Scalar(rhs != null).MakeGeneric(); + + if (rhs is null) + return Scalar(true).MakeGeneric(); + + return lhs != np.asanyarray(rhs); + } + + /// + /// Element-wise not-equal comparison with scalar on left (!=). + /// + public static NDArray operator !=(object lhs, NDArray rhs) + { + if (rhs is null) + return Scalar(lhs != null).MakeGeneric(); + + if (lhs is null) + return Scalar(true).MakeGeneric(); + + return np.asanyarray(lhs) != rhs; } } } diff --git a/src/NumSharp.Core/Operations/Elementwise/NDArray.OR.cs b/src/NumSharp.Core/Operations/Elementwise/NDArray.OR.cs index ba262ac9..55c73566 100644 --- a/src/NumSharp.Core/Operations/Elementwise/NDArray.OR.cs +++ b/src/NumSharp.Core/Operations/Elementwise/NDArray.OR.cs @@ -1,20 +1,80 @@ -namespace NumSharp +namespace NumSharp { public partial class NDArray { - public static NDArray operator |(NDArray np_, NDArray obj_) + /// + /// Element-wise bitwise OR operation. + /// For boolean arrays: logical OR. + /// For integer arrays: bitwise OR. + /// Supports broadcasting. + /// + public static NDArray operator |(NDArray lhs, NDArray rhs) { - return null; - //var boolTensor = new NDArray(typeof(bool),np_.shape); - //bool[] bools = boolTensor.Storage.GetData() as bool[]; + return lhs.TensorEngine.BitwiseOr(lhs, rhs); + } + + /// + /// Element-wise bitwise OR with scalar. + /// + public static NDArray operator |(NDArray lhs, byte rhs) + { + return lhs.TensorEngine.BitwiseOr(lhs, Scalar(rhs)); + } - //bool[] np = np_.MakeGeneric().Storage.GetData() as bool[]; - //bool[] obj = obj_.MakeGeneric().Storage.GetData() as bool[]; + /// + /// Element-wise bitwise OR with scalar. + /// + public static NDArray operator |(byte lhs, NDArray rhs) + { + return rhs.TensorEngine.BitwiseOr(Scalar(lhs), rhs); + } - // for(int idx = 0;idx < bools.Length;idx++) - // bools[idx] = np[idx] || obj[idx]; + /// + /// Element-wise bitwise OR with scalar. + /// + public static NDArray operator |(NDArray lhs, int rhs) + { + return lhs.TensorEngine.BitwiseOr(lhs, Scalar(rhs)); + } + + /// + /// Element-wise bitwise OR with scalar. + /// + public static NDArray operator |(int lhs, NDArray rhs) + { + return rhs.TensorEngine.BitwiseOr(Scalar(lhs), rhs); + } - //return boolTensor.MakeGeneric(); + /// + /// Element-wise bitwise OR with scalar. + /// + public static NDArray operator |(NDArray lhs, long rhs) + { + return lhs.TensorEngine.BitwiseOr(lhs, Scalar(rhs)); + } + + /// + /// Element-wise bitwise OR with scalar. + /// + public static NDArray operator |(long lhs, NDArray rhs) + { + return rhs.TensorEngine.BitwiseOr(Scalar(lhs), rhs); + } + + /// + /// Element-wise bitwise OR with boolean scalar. + /// + public static NDArray operator |(NDArray lhs, bool rhs) + { + return lhs.TensorEngine.BitwiseOr(lhs, Scalar(rhs)); + } + + /// + /// Element-wise bitwise OR with boolean scalar. + /// + public static NDArray operator |(bool lhs, NDArray rhs) + { + return rhs.TensorEngine.BitwiseOr(Scalar(lhs), rhs); } } } diff --git a/test/NumSharp.UnitTest/Backends/Kernels/BattleProofTests.cs b/test/NumSharp.UnitTest/Backends/Kernels/BattleProofTests.cs new file mode 100644 index 00000000..4d716c4a --- /dev/null +++ b/test/NumSharp.UnitTest/Backends/Kernels/BattleProofTests.cs @@ -0,0 +1,222 @@ +using System; +using AwesomeAssertions; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using NumSharp; +using NumSharp.UnitTest.Utilities; + +namespace NumSharp.UnitTest.Backends.Kernels; + +/// +/// Battle-proof tests verifying IL kernel fixes against NumPy behavior. +/// Each test documents the NumPy output and verifies NumSharp matches. +/// +public class BattleProofTests : TestClass +{ + #region Fix 1: Sliced Array × Scalar (ClassifyPath contiguity check) + + [Test] + public void SlicedColumn_MultiplyByScalar_MatchesNumPy() + { + // NumPy: x = np.arange(4).reshape(2,2); y = x[:,1]; z = y * 2 + // y = [1, 3], z = [2, 6] + var x = np.arange(4).reshape(2, 2); + var y = x[":,1"]; // column slice, stride=2 + + Assert.IsFalse(y.Shape.IsContiguous, "Column slice should not be contiguous"); + + var z = y * 2; + + Assert.AreEqual(2, z.GetInt32(0), "y[0]*2 = 1*2 = 2"); + Assert.AreEqual(6, z.GetInt32(1), "y[1]*2 = 3*2 = 6"); + } + + [Test] + public void StepSlice_MultiplyByScalar_MatchesNumPy() + { + // NumPy: np.arange(10)[::2] * 3 = [0, 6, 12, 18, 24] + var arr = np.arange(10); + var step = arr["::2"]; + + Assert.IsFalse(step.Shape.IsContiguous, "Step slice should not be contiguous"); + + var result = step * 3; + + result.Should().BeOfValues(0, 6, 12, 18, 24); + } + + [Test] + public void ReverseSlice_MultiplyByScalar_MatchesNumPy() + { + // NumPy: np.arange(10)[::-1] * 2 = [18, 16, 14, 12, 10, 8, 6, 4, 2, 0] + var arr = np.arange(10); + var rev = arr["::-1"]; + + var result = rev * 2; + + result.Should().BeOfValues(18, 16, 14, 12, 10, 8, 6, 4, 2, 0); + } + + [Test] + public void SlicedRow_MultiplyByScalar_MatchesNumPy() + { + // NumPy: np.arange(12).reshape(3,4)[1,:] * 3 = [12, 15, 18, 21] + var arr = np.arange(12).reshape(3, 4); + var row = arr["1,:"]; + + // Row slice IS contiguous (strides match) + Assert.IsTrue(row.Shape.IsContiguous, "Row slice should be contiguous"); + + var result = row * 3; + + result.Should().BeOfValues(12, 15, 18, 21); + } + + [Test] + public void ScalarMultiplySlice_BothDirections_MatchesNumPy() + { + // NumPy: 2 * x[:,1] and x[:,1] * 2 should give same result + var x = np.arange(4).reshape(2, 2); + var y = x[":,1"]; + + var left = 2 * y; + var right = y * 2; + + left.Should().BeOfValues(2, 6); + right.Should().BeOfValues(2, 6); + } + + #endregion + + #region Fix 2: Division Type Promotion (True Division → float64) + + [Test] + public void IntDivInt_ReturnsFloat64_MatchesNumPy() + { + // NumPy: np.array([1,2,3,4], dtype=int32) / np.array([2,2,2,2], dtype=int32) + // Result: [0.5, 1.0, 1.5, 2.0], dtype=float64 + var a = np.array(new[] { 1, 2, 3, 4 }); + var b = np.array(new[] { 2, 2, 2, 2 }); + + var result = a / b; + + Assert.AreEqual(typeof(double), result.dtype, "int/int should return float64"); + result.Should().BeOfValues(0.5, 1.0, 1.5, 2.0); + } + + [Test] + public void UInt8DivScalar_ReturnsFloat64_MatchesNumPy() + { + // NumPy: np.array([10, 20, 30], dtype=uint8) / 5 + // Result: [2.0, 4.0, 6.0], dtype=float64 + var a = np.array(new byte[] { 10, 20, 30 }); + + var result = a / 5; + + Assert.AreEqual(typeof(double), result.dtype, "uint8/scalar should return float64"); + result.Should().BeOfValues(2.0, 4.0, 6.0); + } + + [Test] + public void IntDivInt_FractionalResult_MatchesNumPy() + { + // NumPy: 3 / 2 = 1.5 (not 1 like integer division) + var a = np.array(new[] { 3 }); + var b = np.array(new[] { 2 }); + + var result = a / b; + + Assert.AreEqual(typeof(double), result.dtype); + Assert.AreEqual(1.5, result.GetDouble(0), 0.001, "3/2 should be 1.5, not 1"); + } + + [Test] + public void Float32DivFloat32_StaysFloat32_MatchesNumPy() + { + // NumPy: float32 / float32 = float32 (not promoted to float64) + var a = np.array(new[] { 3.0f, 6.0f }); + var b = np.array(new[] { 2.0f, 2.0f }); + + var result = a / b; + + Assert.AreEqual(typeof(float), result.dtype, "float32/float32 should stay float32"); + } + + [Test] + public void Float64DivFloat64_StaysFloat64_MatchesNumPy() + { + // NumPy: float64 / float64 = float64 + var a = np.array(new[] { 3.0, 6.0 }); + var b = np.array(new[] { 2.0, 2.0 }); + + var result = a / b; + + Assert.AreEqual(typeof(double), result.dtype, "float64/float64 should stay float64"); + } + + #endregion + + #region Fix 3: Sign(NaN) Returns NaN (not exception) + + [Test] + public void SignNaN_ReturnsNaN_MatchesNumPy() + { + // NumPy: np.sign(np.nan) = nan + // .NET Math.Sign(NaN) throws ArithmeticException - we fixed this + var arr = np.array(new[] { double.NaN }); + + var result = np.sign(arr); + + Assert.IsTrue(double.IsNaN(result.GetDouble(0)), "sign(NaN) should return NaN, not throw"); + } + + [Test] + public void SignFloat32NaN_ReturnsNaN_MatchesNumPy() + { + // NumPy: np.sign(np.float32('nan')) = nan + var arr = np.array(new[] { float.NaN }); + + var result = np.sign(arr); + + Assert.IsTrue(float.IsNaN(result.GetSingle(0)), "sign(float32 NaN) should return NaN"); + } + + [Test] + public void SignInfinity_ReturnsOne_MatchesNumPy() + { + // NumPy: np.sign([inf, -inf]) = [1, -1] + var arr = np.array(new[] { double.PositiveInfinity, double.NegativeInfinity }); + + var result = np.sign(arr); + + Assert.AreEqual(1.0, result.GetDouble(0), "sign(+inf) = 1"); + Assert.AreEqual(-1.0, result.GetDouble(1), "sign(-inf) = -1"); + } + + [Test] + public void SignMixedWithNaN_MatchesNumPy() + { + // NumPy: np.sign([nan, 1, -1, 0, nan]) = [nan, 1, -1, 0, nan] + var arr = np.array(new[] { double.NaN, 1.0, -1.0, 0.0, double.NaN }); + + var result = np.sign(arr); + + Assert.IsTrue(double.IsNaN(result.GetDouble(0)), "[0] NaN -> NaN"); + Assert.AreEqual(1.0, result.GetDouble(1), "[1] 1 -> 1"); + Assert.AreEqual(-1.0, result.GetDouble(2), "[2] -1 -> -1"); + Assert.AreEqual(0.0, result.GetDouble(3), "[3] 0 -> 0"); + Assert.IsTrue(double.IsNaN(result.GetDouble(4)), "[4] NaN -> NaN"); + } + + [Test] + public void SignBasicValues_MatchesNumPy() + { + // NumPy: np.sign([1, -1, 0, 5, -5]) = [1, -1, 0, 1, -1] + var arr = np.array(new[] { 1.0, -1.0, 0.0, 5.0, -5.0 }); + + var result = np.sign(arr); + + result.Should().BeOfValues(1.0, -1.0, 0.0, 1.0, -1.0); + } + + #endregion +} diff --git a/test/NumSharp.UnitTest/Backends/Kernels/BinaryOpTests.cs b/test/NumSharp.UnitTest/Backends/Kernels/BinaryOpTests.cs new file mode 100644 index 00000000..1637530b --- /dev/null +++ b/test/NumSharp.UnitTest/Backends/Kernels/BinaryOpTests.cs @@ -0,0 +1,608 @@ +using System; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using NumSharp; +using NumSharp.UnitTest.Utilities; +using TUnit.Core; + +namespace NumSharp.UnitTest.Backends.Kernels; + +/// +/// Comprehensive tests for binary operations (Add, Subtract, Multiply, Divide, Mod). +/// All expected values are verified against NumPy 2.x output. +/// +public class BinaryOpTests +{ + #region Same-Type Add Tests + + [Test] + public void Add_Bool_SameType() + { + // NumPy: np.add([True, False, True, False], [True, True, False, False]) = [True, True, True, False] + var a = np.array(new[] { true, false, true, false }); + var b = np.array(new[] { true, true, false, false }); + var result = a + b; + + Assert.IsTrue(result.GetBoolean(0)); + Assert.IsTrue(result.GetBoolean(1)); + Assert.IsTrue(result.GetBoolean(2)); + Assert.IsFalse(result.GetBoolean(3)); + } + + [Test] + public void Add_Byte_SameType() + { + // NumPy: [1, 2, 3, 4] + [2, 2, 2, 2] = [3, 4, 5, 6] + var a = np.array(new byte[] { 1, 2, 3, 4 }); + var b = np.array(new byte[] { 2, 2, 2, 2 }); + var result = a + b; + + result.Should().BeOfValues(3, 4, 5, 6).And.BeOfType(NPTypeCode.Byte); + } + + [Test] + public void Add_Int16_SameType() + { + var a = np.array(new short[] { 1, 2, 3, 4 }); + var b = np.array(new short[] { 2, 2, 2, 2 }); + var result = a + b; + + result.Should().BeOfValues(3, 4, 5, 6).And.BeOfType(NPTypeCode.Int16); + } + + [Test] + public void Add_UInt16_SameType() + { + var a = np.array(new ushort[] { 1, 2, 3, 4 }); + var b = np.array(new ushort[] { 2, 2, 2, 2 }); + var result = a + b; + + result.Should().BeOfValues(3, 4, 5, 6).And.BeOfType(NPTypeCode.UInt16); + } + + [Test] + public void Add_Int32_SameType() + { + var a = np.array(new[] { 1, 2, 3, 4 }); + var b = np.array(new[] { 2, 2, 2, 2 }); + var result = a + b; + + result.Should().BeOfValues(3, 4, 5, 6).And.BeOfType(NPTypeCode.Int32); + } + + [Test] + public void Add_UInt32_SameType() + { + var a = np.array(new uint[] { 1, 2, 3, 4 }); + var b = np.array(new uint[] { 2, 2, 2, 2 }); + var result = a + b; + + result.Should().BeOfValues(3, 4, 5, 6).And.BeOfType(NPTypeCode.UInt32); + } + + [Test] + public void Add_Int64_SameType() + { + var a = np.array(new long[] { 1, 2, 3, 4 }); + var b = np.array(new long[] { 2, 2, 2, 2 }); + var result = a + b; + + result.Should().BeOfValues(3L, 4L, 5L, 6L).And.BeOfType(NPTypeCode.Int64); + } + + [Test] + public void Add_UInt64_SameType() + { + var a = np.array(new ulong[] { 1, 2, 3, 4 }); + var b = np.array(new ulong[] { 2, 2, 2, 2 }); + var result = a + b; + + result.Should().BeOfValues(3UL, 4UL, 5UL, 6UL).And.BeOfType(NPTypeCode.UInt64); + } + + [Test] + public void Add_Float32_SameType() + { + var a = np.array(new float[] { 1f, 2f, 3f, 4f }); + var b = np.array(new float[] { 2f, 2f, 2f, 2f }); + var result = a + b; + + result.Should().BeOfValues(3f, 4f, 5f, 6f).And.BeOfType(NPTypeCode.Single); + } + + [Test] + public void Add_Float64_SameType() + { + var a = np.array(new double[] { 1.0, 2.0, 3.0, 4.0 }); + var b = np.array(new double[] { 2.0, 2.0, 2.0, 2.0 }); + var result = a + b; + + result.Should().BeOfValues(3.0, 4.0, 5.0, 6.0).And.BeOfType(NPTypeCode.Double); + } + + #endregion + + #region Same-Type Subtract Tests + + [Test] + public void Subtract_Int32_SameType() + { + // NumPy: [1, 2, 3, 4] - [2, 2, 2, 2] = [-1, 0, 1, 2] + var a = np.array(new[] { 1, 2, 3, 4 }); + var b = np.array(new[] { 2, 2, 2, 2 }); + var result = a - b; + + result.Should().BeOfValues(-1, 0, 1, 2).And.BeOfType(NPTypeCode.Int32); + } + + [Test] + public void Subtract_Byte_Underflow() + { + // NumPy: uint8 [1, 2, 3, 4] - [2, 2, 2, 2] = [255, 0, 1, 2] (wraps) + var a = np.array(new byte[] { 1, 2, 3, 4 }); + var b = np.array(new byte[] { 2, 2, 2, 2 }); + var result = a - b; + + result.Should().BeOfValues(255, 0, 1, 2).And.BeOfType(NPTypeCode.Byte); + } + + [Test] + public void Subtract_UInt16_Underflow() + { + // NumPy: uint16 [1, 2, 3, 4] - [2, 2, 2, 2] = [65535, 0, 1, 2] + var a = np.array(new ushort[] { 1, 2, 3, 4 }); + var b = np.array(new ushort[] { 2, 2, 2, 2 }); + var result = a - b; + + result.Should().BeOfValues(65535, 0, 1, 2).And.BeOfType(NPTypeCode.UInt16); + } + + [Test] + public void Subtract_UInt32_Underflow() + { + // NumPy: uint32 [1, 2, 3, 4] - [2, 2, 2, 2] = [4294967295, 0, 1, 2] + var a = np.array(new uint[] { 1, 2, 3, 4 }); + var b = np.array(new uint[] { 2, 2, 2, 2 }); + var result = a - b; + + result.Should().BeOfValues(4294967295u, 0u, 1u, 2u).And.BeOfType(NPTypeCode.UInt32); + } + + [Test] + public void Subtract_Float64_SameType() + { + var a = np.array(new double[] { 1.0, 2.0, 3.0, 4.0 }); + var b = np.array(new double[] { 2.0, 2.0, 2.0, 2.0 }); + var result = a - b; + + result.Should().BeOfValues(-1.0, 0.0, 1.0, 2.0).And.BeOfType(NPTypeCode.Double); + } + + #endregion + + #region Same-Type Multiply Tests + + [Test] + public void Multiply_Bool_SameType() + { + // NumPy: True * True = True, True * False = False (logical AND behavior) + var a = np.array(new[] { true, false, true, false }); + var b = np.array(new[] { true, true, false, false }); + var result = a * b; + + Assert.IsTrue(result.GetBoolean(0)); + Assert.IsFalse(result.GetBoolean(1)); + Assert.IsFalse(result.GetBoolean(2)); + Assert.IsFalse(result.GetBoolean(3)); + } + + [Test] + public void Multiply_Int32_SameType() + { + var a = np.array(new[] { 1, 2, 3, 4 }); + var b = np.array(new[] { 2, 2, 2, 2 }); + var result = a * b; + + result.Should().BeOfValues(2, 4, 6, 8).And.BeOfType(NPTypeCode.Int32); + } + + [Test] + public void Multiply_Float64_SameType() + { + var a = np.array(new double[] { 1.0, 2.0, 3.0, 4.0 }); + var b = np.array(new double[] { 2.0, 2.0, 2.0, 2.0 }); + var result = a * b; + + result.Should().BeOfValues(2.0, 4.0, 6.0, 8.0).And.BeOfType(NPTypeCode.Double); + } + + #endregion + + #region Same-Type Divide Tests + + [Test] + public void Divide_Float32_SameType() + { + var a = np.array(new float[] { 1f, 2f, 3f, 4f }); + var b = np.array(new float[] { 2f, 2f, 2f, 2f }); + var result = a / b; + + result.Should().BeOfValues(0.5f, 1.0f, 1.5f, 2.0f).And.BeOfType(NPTypeCode.Single); + } + + [Test] + public void Divide_Float64_SameType() + { + var a = np.array(new double[] { 1.0, 2.0, 3.0, 4.0 }); + var b = np.array(new double[] { 2.0, 2.0, 2.0, 2.0 }); + var result = a / b; + + result.Should().BeOfValues(0.5, 1.0, 1.5, 2.0).And.BeOfType(NPTypeCode.Double); + } + + [Test] + [OpenBugs] // NumSharp does integer division, NumPy promotes to float64 + public void Divide_Int32_ReturnsDouble() + { + // NumPy: int32 / int32 returns float64 + var a = np.array(new[] { 1, 2, 3, 4 }); + var b = np.array(new[] { 2, 2, 2, 2 }); + var result = a / b; + + result.Should().BeOfValues(0.5, 1.0, 1.5, 2.0).And.BeOfType(NPTypeCode.Double); + } + + #endregion + + #region Same-Type Mod Tests + + [Test] + public void Mod_Int32_SameType() + { + // NumPy: [1, 2, 3, 4] % [2, 3, 2, 3] = [1, 2, 1, 1] + var a = np.array(new[] { 1, 2, 3, 4 }); + var b = np.array(new[] { 2, 3, 2, 3 }); + var result = a % b; + + result.Should().BeOfValues(1, 2, 1, 1).And.BeOfType(NPTypeCode.Int32); + } + + [Test] + public void Mod_Float64_SameType() + { + var a = np.array(new double[] { 1.0, 2.0, 3.0, 4.0 }); + var b = np.array(new double[] { 2.0, 3.0, 2.0, 3.0 }); + var result = a % b; + + result.Should().BeOfValues(1.0, 2.0, 1.0, 1.0).And.BeOfType(NPTypeCode.Double); + } + + #endregion + + #region Scalar Broadcasting Tests + + [Test] + public void Add_ArrayPlusScalar_Int32() + { + // NumPy: [1, 2, 3, 4] + 2 = [3, 4, 5, 6] + var a = np.array(new[] { 1, 2, 3, 4 }); + var result = a + 2; + + result.Should().BeOfValues(3, 4, 5, 6).And.BeOfType(NPTypeCode.Int32); + } + + [Test] + public void Add_ScalarPlusArray_Int32() + { + // NumPy: 2 + [1, 2, 3, 4] = [3, 4, 5, 6] + var a = np.array(new[] { 1, 2, 3, 4 }); + var result = 2 + a; + + result.Should().BeOfValues(3, 4, 5, 6).And.BeOfType(NPTypeCode.Int32); + } + + [Test] + public void Subtract_ArrayMinusScalar_Int32() + { + // NumPy: [1, 2, 3, 4] - 2 = [-1, 0, 1, 2] + var a = np.array(new[] { 1, 2, 3, 4 }); + var result = a - 2; + + result.Should().BeOfValues(-1, 0, 1, 2).And.BeOfType(NPTypeCode.Int32); + } + + [Test] + public void Subtract_ScalarMinusArray_Int32() + { + // NumPy: 2 - [1, 2, 3, 4] = [1, 0, -1, -2] + var a = np.array(new[] { 1, 2, 3, 4 }); + var result = 2 - a; + + result.Should().BeOfValues(1, 0, -1, -2).And.BeOfType(NPTypeCode.Int32); + } + + [Test] + public void Multiply_ArrayTimesScalar_Float64() + { + var a = np.array(new double[] { 1.0, 2.0, 3.0, 4.0 }); + var result = a * 2.0; + + result.Should().BeOfValues(2.0, 4.0, 6.0, 8.0).And.BeOfType(NPTypeCode.Double); + } + + [Test] + public void Divide_ArrayDividedByScalar_Float64() + { + var a = np.array(new double[] { 1.0, 2.0, 3.0, 4.0 }); + var result = a / 2.0; + + result.Should().BeOfValues(0.5, 1.0, 1.5, 2.0).And.BeOfType(NPTypeCode.Double); + } + + [Test] + public void Divide_ScalarDividedByArray_Float64() + { + // NumPy: 2 / [1, 2, 3, 4] = [2.0, 1.0, 0.666..., 0.5] + var a = np.array(new double[] { 1.0, 2.0, 3.0, 4.0 }); + var result = 2.0 / a; + + Assert.AreEqual(2.0, result.GetDouble(0)); + Assert.AreEqual(1.0, result.GetDouble(1)); + Assert.IsTrue(Math.Abs(result.GetDouble(2) - 0.6666666666666666) < 1e-10); + Assert.AreEqual(0.5, result.GetDouble(3)); + } + + [Test] + public void Mod_ArrayModScalar_Int32() + { + // NumPy: [1, 2, 3, 4] % 2 = [1, 0, 1, 0] + var a = np.array(new[] { 1, 2, 3, 4 }); + var result = a % 2; + + result.Should().BeOfValues(1, 0, 1, 0).And.BeOfType(NPTypeCode.Int32); + } + + [Test] + public void Mod_ScalarModArray_Int32() + { + // NumPy: 2 % [1, 2, 3, 4] = [0, 0, 2, 2] + var a = np.array(new[] { 1, 2, 3, 4 }); + var result = 2 % a; + + result.Should().BeOfValues(0, 0, 2, 2).And.BeOfType(NPTypeCode.Int32); + } + + #endregion + + #region Broadcasting Shape Tests + + [Test] + public void Add_2D_Plus_1D_Broadcasting() + { + // NumPy: (3,4) + (4,) = [[2,4,6,8],[6,8,10,12],[10,12,14,16]] + var a = np.array(new[,] { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } }); + var b = np.array(new[] { 1, 2, 3, 4 }); + var result = a + b; + + result.Should().BeShaped(3, 4); + result.Should().BeOfValues(2, 4, 6, 8, 6, 8, 10, 12, 10, 12, 14, 16); + } + + [Test] + public void Add_Column_Plus_Row_Broadcasting() + { + // NumPy: (3,1) + (1,4) = [[2,3,4,5],[3,4,5,6],[4,5,6,7]] + var a = np.array(new[,] { { 1 }, { 2 }, { 3 } }); + var b = np.array(new[,] { { 1, 2, 3, 4 } }); + var result = a + b; + + result.Should().BeShaped(3, 4); + result.Should().BeOfValues(2, 3, 4, 5, 3, 4, 5, 6, 4, 5, 6, 7); + } + + [Test] + public void Add_2D_Plus_1D_Float64() + { + // NumPy: [[1,2],[3,4]] + [10,20] = [[11,22],[13,24]] + var a = np.array(new[,] { { 1.0, 2.0 }, { 3.0, 4.0 } }); + var b = np.array(new[] { 10.0, 20.0 }); + var result = a + b; + + result.Should().BeShaped(2, 2); + result.Should().BeOfValues(11.0, 22.0, 13.0, 24.0); + } + + #endregion + + #region Edge Cases - Division by Zero + + [Test] + public void Divide_Float64_DivisionByZero() + { + // NumPy: [1.0, -1.0, 0.0] / [0.0, 0.0, 0.0] = [inf, -inf, nan] + var a = np.array(new double[] { 1.0, -1.0, 0.0 }); + var b = np.array(new double[] { 0.0, 0.0, 0.0 }); + var result = a / b; + + Assert.IsTrue(double.IsPositiveInfinity(result.GetDouble(0))); + Assert.IsTrue(double.IsNegativeInfinity(result.GetDouble(1))); + Assert.IsTrue(double.IsNaN(result.GetDouble(2))); + } + + #endregion + + #region Edge Cases - Infinity Arithmetic + + [Test] + public void Add_InfinityArithmetic() + { + // NumPy: [inf, -inf, inf, 1.0] + [1.0, 1.0, inf, inf] = [inf, -inf, inf, inf] + var a = np.array(new double[] { double.PositiveInfinity, double.NegativeInfinity, double.PositiveInfinity, 1.0 }); + var b = np.array(new double[] { 1.0, 1.0, double.PositiveInfinity, double.PositiveInfinity }); + var result = a + b; + + Assert.IsTrue(double.IsPositiveInfinity(result.GetDouble(0))); + Assert.IsTrue(double.IsNegativeInfinity(result.GetDouble(1))); + Assert.IsTrue(double.IsPositiveInfinity(result.GetDouble(2))); + Assert.IsTrue(double.IsPositiveInfinity(result.GetDouble(3))); + } + + [Test] + public void Subtract_InfMinusInf_IsNaN() + { + // NumPy: inf - inf = nan + var a = np.array(new double[] { double.PositiveInfinity }); + var b = np.array(new double[] { double.PositiveInfinity }); + var result = a - b; + + Assert.IsTrue(double.IsNaN(result.GetDouble(0))); + } + + [Test] + public void Multiply_InfTimesZero_IsNaN() + { + // NumPy: inf * 0 = nan + var a = np.array(new double[] { double.PositiveInfinity }); + var b = np.array(new double[] { 0.0 }); + var result = a * b; + + Assert.IsTrue(double.IsNaN(result.GetDouble(0))); + } + + #endregion + + #region Edge Cases - NaN Propagation + + [Test] + public void Add_NaNPropagation() + { + // NumPy: [1.0, nan, 3.0] + [2.0, 2.0, nan] = [3.0, nan, nan] + var a = np.array(new double[] { 1.0, double.NaN, 3.0 }); + var b = np.array(new double[] { 2.0, 2.0, double.NaN }); + var result = a + b; + + Assert.AreEqual(3.0, result.GetDouble(0)); + Assert.IsTrue(double.IsNaN(result.GetDouble(1))); + Assert.IsTrue(double.IsNaN(result.GetDouble(2))); + } + + [Test] + public void Multiply_NaNPropagation() + { + var a = np.array(new double[] { 1.0, double.NaN, 3.0 }); + var b = np.array(new double[] { 2.0, 2.0, double.NaN }); + var result = a * b; + + Assert.AreEqual(2.0, result.GetDouble(0)); + Assert.IsTrue(double.IsNaN(result.GetDouble(1))); + Assert.IsTrue(double.IsNaN(result.GetDouble(2))); + } + + #endregion + + #region Edge Cases - 0D Scalars + + [Test] + [OpenBugs] // NumSharp doesn't properly handle 0D scalars (returns 1D instead) + public void Add_0DScalars() + { + // NumPy: np.array(5) + np.array(3) = 8, shape=() + var a = np.array(5); + var b = np.array(3); + var result = a + b; + + Assert.AreEqual(0, result.ndim); + Assert.AreEqual(8, result.GetInt32(0)); + } + + #endregion + + #region Edge Cases - Empty Arrays + + [Test] + public void Add_EmptyArrays() + { + // NumPy: [] + [] = [], shape=(0,) + var a = np.array(Array.Empty()); + var b = np.array(Array.Empty()); + var result = a + b; + + // Note: NumSharp may return IsEmpty=true, size=0 but with different shape representation + Assert.AreEqual(0, result.size); + } + + #endregion + + #region Type Promotion Tests + + [Test] + public void Add_Int32_Float64_Promotion() + { + // NumPy: int32 + float64 → float64: [1, 2, 3] + [0.5, 0.5, 0.5] = [1.5, 2.5, 3.5] + var a = np.array(new[] { 1, 2, 3 }); + var b = np.array(new double[] { 0.5, 0.5, 0.5 }); + var result = a + b; + + result.Should().BeOfValues(1.5, 2.5, 3.5).And.BeOfType(NPTypeCode.Double); + } + + [Test] + public void Add_Int32_Int64_Promotion() + { + // NumPy: int32 + int64 → int64 + var a = np.array(new[] { 1, 2, 3 }); + var b = np.array(new long[] { 1, 2, 3 }); + var result = a + b; + + result.Should().BeOfValues(2L, 4L, 6L).And.BeOfType(NPTypeCode.Int64); + } + + [Test] + public void Add_Byte_Int32_Promotion() + { + // NumPy: uint8 + int32 → int32 + var a = np.array(new byte[] { 1, 2, 3 }); + var b = np.array(new[] { 1, 2, 3 }); + var result = a + b; + + result.Should().BeOfValues(2, 4, 6).And.BeOfType(NPTypeCode.Int32); + } + + [Test] + public void Add_Bool_Int32_Promotion() + { + // NumPy: bool + int32 → int32: [True, False, True] + [1, 2, 3] = [2, 2, 4] + var a = np.array(new[] { true, false, true }); + var b = np.array(new[] { 1, 2, 3 }); + var result = a + b; + + result.Should().BeOfValues(2, 2, 4).And.BeOfType(NPTypeCode.Int32); + } + + #endregion + + #region Overflow Behavior Tests + + [Test] + public void Add_Byte_Overflow() + { + // NumPy: uint8 255 + 1 = 0 (wraps) + var a = np.array(new byte[] { 255 }); + var b = np.array(new byte[] { 1 }); + var result = a + b; + + result.Should().BeOfValues(0).And.BeOfType(NPTypeCode.Byte); + } + + [Test] + public void Add_Int32_Overflow() + { + // NumPy: int32 2147483647 + 1 = -2147483648 (wraps) + var a = np.array(new[] { int.MaxValue }); + var b = np.array(new[] { 1 }); + var result = a + b; + + result.Should().BeOfValues(int.MinValue).And.BeOfType(NPTypeCode.Int32); + } + + #endregion +} diff --git a/test/NumSharp.UnitTest/Backends/Kernels/BitwiseOpTests.cs b/test/NumSharp.UnitTest/Backends/Kernels/BitwiseOpTests.cs new file mode 100644 index 00000000..779d63a3 --- /dev/null +++ b/test/NumSharp.UnitTest/Backends/Kernels/BitwiseOpTests.cs @@ -0,0 +1,389 @@ +using System; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using NumSharp; +using NumSharp.Generic; +using NumSharp.UnitTest.Utilities; +using TUnit.Core; + +namespace NumSharp.UnitTest.Backends.Kernels; + +/// +/// Comprehensive tests for bitwise operations (And, Or, Xor). +/// All expected values are verified against NumPy 2.x output. +/// +public class BitwiseOpTests +{ + #region Boolean AND Tests + + [Test] + public void BitwiseAnd_Bool_TruthTable() + { + // NumPy: [True, True, False, False] & [True, False, True, False] + // = [True, False, False, False] + var a = np.array(new[] { true, true, false, false }); + var b = np.array(new[] { true, false, true, false }); + var result = a & b; + + Assert.IsTrue(result.GetBoolean(0)); + Assert.IsFalse(result.GetBoolean(1)); + Assert.IsFalse(result.GetBoolean(2)); + Assert.IsFalse(result.GetBoolean(3)); + } + + [Test] + public void BitwiseAnd_Bool_WithScalar_True() + { + var a = np.array(new[] { true, true, false, false }); + var result = a & true; + + Assert.IsTrue(result.GetBoolean(0)); + Assert.IsTrue(result.GetBoolean(1)); + Assert.IsFalse(result.GetBoolean(2)); + Assert.IsFalse(result.GetBoolean(3)); + } + + [Test] + public void BitwiseAnd_Bool_WithScalar_False() + { + var a = np.array(new[] { true, true, false, false }); + var result = a & false; + + Assert.IsFalse(result.GetBoolean(0)); + Assert.IsFalse(result.GetBoolean(1)); + Assert.IsFalse(result.GetBoolean(2)); + Assert.IsFalse(result.GetBoolean(3)); + } + + #endregion + + #region Boolean OR Tests + + [Test] + public void BitwiseOr_Bool_TruthTable() + { + // NumPy: [True, True, False, False] | [True, False, True, False] + // = [True, True, True, False] + var a = np.array(new[] { true, true, false, false }); + var b = np.array(new[] { true, false, true, false }); + var result = a | b; + + Assert.IsTrue(result.GetBoolean(0)); + Assert.IsTrue(result.GetBoolean(1)); + Assert.IsTrue(result.GetBoolean(2)); + Assert.IsFalse(result.GetBoolean(3)); + } + + [Test] + public void BitwiseOr_Bool_WithScalar_True() + { + var a = np.array(new[] { true, true, false, false }); + var result = a | true; + + Assert.IsTrue(result.GetBoolean(0)); + Assert.IsTrue(result.GetBoolean(1)); + Assert.IsTrue(result.GetBoolean(2)); + Assert.IsTrue(result.GetBoolean(3)); + } + + [Test] + public void BitwiseOr_Bool_WithScalar_False() + { + var a = np.array(new[] { true, true, false, false }); + var result = a | false; + + Assert.IsTrue(result.GetBoolean(0)); + Assert.IsTrue(result.GetBoolean(1)); + Assert.IsFalse(result.GetBoolean(2)); + Assert.IsFalse(result.GetBoolean(3)); + } + + #endregion + + #region Boolean XOR Tests + + [Test] + public void BitwiseXor_Bool_TruthTable() + { + // NumPy: [True, True, False, False] ^ [True, False, True, False] + // = [False, True, True, False] + // Use NDArray to get the typed ^ operator + NDArray a = np.array(new[] { true, true, false, false }).MakeGeneric(); + NDArray b = np.array(new[] { true, false, true, false }).MakeGeneric(); + var result = a ^ b; + + Assert.IsFalse(result.GetBoolean(0)); + Assert.IsTrue(result.GetBoolean(1)); + Assert.IsTrue(result.GetBoolean(2)); + Assert.IsFalse(result.GetBoolean(3)); + } + + #endregion + + #region Boolean NOT Tests + + [Test] + public void BitwiseNot_Bool() + { + // NumPy: ~[True, True, False, False] = [False, False, True, True] + var a = np.array(new[] { true, true, false, false }); + var result = !a; + + Assert.IsFalse(result.GetBoolean(0)); + Assert.IsFalse(result.GetBoolean(1)); + Assert.IsTrue(result.GetBoolean(2)); + Assert.IsTrue(result.GetBoolean(3)); + } + + #endregion + + #region Integer Bitwise AND Tests + + [Test] + public void BitwiseAnd_Byte() + { + // NumPy: [0b11110000, 0b10101010, 0b00001111] & [0b11001100, 0b01010101, 0b11110000] + // = [0b11000000, 0b00000000, 0b00000000] = [192, 0, 0] + var a = np.array(new byte[] { 0b11110000, 0b10101010, 0b00001111 }); + var b = np.array(new byte[] { 0b11001100, 0b01010101, 0b11110000 }); + var result = a & b; + + result.Should().BeOfValues(192, 0, 0).And.BeOfType(NPTypeCode.Byte); + } + + [Test] + public void BitwiseAnd_Int32() + { + var a = np.array(new[] { 0b11110000, 0b10101010, 0b00001111 }); + var b = np.array(new[] { 0b11001100, 0b01010101, 0b11110000 }); + var result = a & b; + + result.Should().BeOfValues(192, 0, 0).And.BeOfType(NPTypeCode.Int32); + } + + [Test] + public void BitwiseAnd_Int64() + { + var a = np.array(new long[] { 0b11110000, 0b10101010, 0b00001111 }); + var b = np.array(new long[] { 0b11001100, 0b01010101, 0b11110000 }); + var result = a & b; + + result.Should().BeOfValues(192L, 0L, 0L).And.BeOfType(NPTypeCode.Int64); + } + + #endregion + + #region Integer Bitwise OR Tests + + [Test] + public void BitwiseOr_Byte() + { + // NumPy: [0b11110000, 0b10101010, 0b00001111] | [0b11001100, 0b01010101, 0b11110000] + // = [0b11111100, 0b11111111, 0b11111111] = [252, 255, 255] + var a = np.array(new byte[] { 0b11110000, 0b10101010, 0b00001111 }); + var b = np.array(new byte[] { 0b11001100, 0b01010101, 0b11110000 }); + var result = a | b; + + result.Should().BeOfValues(252, 255, 255).And.BeOfType(NPTypeCode.Byte); + } + + [Test] + public void BitwiseOr_Int32() + { + var a = np.array(new[] { 0b11110000, 0b10101010, 0b00001111 }); + var b = np.array(new[] { 0b11001100, 0b01010101, 0b11110000 }); + var result = a | b; + + result.Should().BeOfValues(252, 255, 255).And.BeOfType(NPTypeCode.Int32); + } + + #endregion + + #region Integer Bitwise XOR Tests + + [Test] + public void BitwiseXor_Byte() + { + // NumPy: [0b11110000, 0b10101010, 0b00001111] ^ [0b11001100, 0b01010101, 0b11110000] + // = [0b00111100, 0b11111111, 0b11111111] = [60, 255, 255] + NDArray a = np.array(new byte[] { 0b11110000, 0b10101010, 0b00001111 }).MakeGeneric(); + NDArray b = np.array(new byte[] { 0b11001100, 0b01010101, 0b11110000 }).MakeGeneric(); + var result = a ^ b; + + result.Should().BeOfValues(60, 255, 255).And.BeOfType(NPTypeCode.Byte); + } + + [Test] + public void BitwiseXor_Int32() + { + NDArray a = np.array(new[] { 0b11110000, 0b10101010, 0b00001111 }).MakeGeneric(); + NDArray b = np.array(new[] { 0b11001100, 0b01010101, 0b11110000 }).MakeGeneric(); + var result = a ^ b; + + result.Should().BeOfValues(60, 255, 255).And.BeOfType(NPTypeCode.Int32); + } + + #endregion + + #region Broadcasting Tests + + [Test] + [OpenBugs] // Bitwise broadcasting may have issues + public void BitwiseAnd_2D_With_1D_Broadcasting() + { + // NumPy: [[True, False], [True, False]] & [True, False] + // = [[True, False], [True, False]] + var a = np.array(new[,] { { true, false }, { true, false } }); + var b = np.array(new[] { true, false }); + var result = a & b; + + result.Should().BeShaped(2, 2); + Assert.IsTrue(result.GetBoolean(0)); + Assert.IsFalse(result.GetBoolean(1)); + Assert.IsTrue(result.GetBoolean(2)); + Assert.IsFalse(result.GetBoolean(3)); + } + + [Test] + [OpenBugs] // Bitwise broadcasting may have issues + public void BitwiseOr_2D_With_1D_Broadcasting() + { + var a = np.array(new[,] { { true, false }, { false, false } }); + var b = np.array(new[] { false, true }); + var result = a | b; + + result.Should().BeShaped(2, 2); + Assert.IsTrue(result.GetBoolean(0)); + Assert.IsTrue(result.GetBoolean(1)); + Assert.IsFalse(result.GetBoolean(2)); + Assert.IsTrue(result.GetBoolean(3)); + } + + [Test] + public void BitwiseAnd_Int32_Scalar_Broadcasting() + { + // Array AND with scalar + var a = np.array(new[] { 0xFF, 0xF0, 0x0F, 0x00 }); + var result = a & 0x0F; + + result.Should().BeOfValues(0x0F, 0x00, 0x0F, 0x00).And.BeOfType(NPTypeCode.Int32); + } + + #endregion + + #region Boolean Mask Scenario Tests + + [Test] + public void BitwiseAnd_BooleanMasks() + { + // Common pattern: combining comparison results + // data > 2 AND data < 5 + var data = np.array(new[] { 1, 2, 3, 4, 5 }); + var mask1 = data > 2; // [False, False, True, True, True] + var mask2 = data < 5; // [True, True, True, True, False] + var combined = mask1 & mask2; // [False, False, True, True, False] + + Assert.IsFalse(combined.GetBoolean(0)); + Assert.IsFalse(combined.GetBoolean(1)); + Assert.IsTrue(combined.GetBoolean(2)); + Assert.IsTrue(combined.GetBoolean(3)); + Assert.IsFalse(combined.GetBoolean(4)); + } + + [Test] + public void BitwiseOr_BooleanMasks() + { + // data > 2 OR data < 5 = all True in this case + var data = np.array(new[] { 1, 2, 3, 4, 5 }); + var mask1 = data > 2; // [False, False, True, True, True] + var mask2 = data < 5; // [True, True, True, True, False] + var combined = mask1 | mask2; // [True, True, True, True, True] + + Assert.IsTrue(combined.GetBoolean(0)); + Assert.IsTrue(combined.GetBoolean(1)); + Assert.IsTrue(combined.GetBoolean(2)); + Assert.IsTrue(combined.GetBoolean(3)); + Assert.IsTrue(combined.GetBoolean(4)); + } + + #endregion + + #region Typed NDArray Tests + + [Test] + public void BitwiseOr_TypedBoolArray() + { + // This tests the NDArray | NDArray operator + var a = np.array(new[] { true, false, true, false }).MakeGeneric(); + var b = np.array(new[] { true, true, false, false }).MakeGeneric(); + var result = a | b; + + Assert.IsTrue(result.GetBoolean(0)); + Assert.IsTrue(result.GetBoolean(1)); + Assert.IsTrue(result.GetBoolean(2)); + Assert.IsFalse(result.GetBoolean(3)); + } + + [Test] + public void BitwiseAnd_TypedBoolArray() + { + var a = np.array(new[] { true, false, true, false }).MakeGeneric(); + var b = np.array(new[] { true, true, false, false }).MakeGeneric(); + var result = a & b; + + Assert.IsTrue(result.GetBoolean(0)); + Assert.IsFalse(result.GetBoolean(1)); + Assert.IsFalse(result.GetBoolean(2)); + Assert.IsFalse(result.GetBoolean(3)); + } + + [Test] + public void BitwiseXor_TypedBoolArray() + { + var a = np.array(new[] { true, false, true, false }).MakeGeneric(); + var b = np.array(new[] { true, true, false, false }).MakeGeneric(); + var result = a ^ b; + + Assert.IsFalse(result.GetBoolean(0)); + Assert.IsTrue(result.GetBoolean(1)); + Assert.IsTrue(result.GetBoolean(2)); + Assert.IsFalse(result.GetBoolean(3)); + } + + #endregion + + #region Sliced Array Tests + + [Test] + public void BitwiseAnd_SlicedArrays() + { + var a = np.array(new[] { true, false, true, false, true, false }); + var b = np.array(new[] { true, true, true, false, false, false }); + + // Slice: every other element + var a_sliced = a["::2"]; // [True, True, True] + var b_sliced = b["::2"]; // [True, True, False] + var result = a_sliced & b_sliced; + + Assert.AreEqual(3, result.size); + Assert.IsTrue(result.GetBoolean(0)); + Assert.IsTrue(result.GetBoolean(1)); + Assert.IsFalse(result.GetBoolean(2)); + } + + #endregion + + #region Empty Array Tests + + [Test] + public void BitwiseAnd_EmptyArrays() + { + var a = np.array(Array.Empty()); + var b = np.array(Array.Empty()); + var result = a & b; + + Assert.AreEqual(0, result.size); + result.Should().BeShaped(0); + } + + #endregion +} diff --git a/test/NumSharp.UnitTest/Backends/Kernels/ComparisonOpTests.cs b/test/NumSharp.UnitTest/Backends/Kernels/ComparisonOpTests.cs new file mode 100644 index 00000000..9138a6e0 --- /dev/null +++ b/test/NumSharp.UnitTest/Backends/Kernels/ComparisonOpTests.cs @@ -0,0 +1,509 @@ +using System; +using System.Threading.Tasks; +using NumSharp; +using NumSharp.UnitTest.Utilities; +using TUnit.Core; +using TUnit.Assertions; +using TUnit.Assertions.Extensions; + +namespace NumSharp.UnitTest.Backends.Kernels; + +/// +/// Comprehensive tests for comparison operations (==, !=, <, >, <=, >=). +/// All expected values are verified against NumPy 2.x output. +/// +public class ComparisonOpTests +{ + #region Basic Equality Tests (Test 1) + + [Test] + public async Task Equal_Int32_SameType() + { + // NumPy: np.array([1, 2, 3, 4, 5]) == np.array([1, 3, 3, 5, 5]) = [True, False, True, False, True] + var a = np.array(new[] { 1, 2, 3, 4, 5 }); + var b = np.array(new[] { 1, 3, 3, 5, 5 }); + var result = a == b; + + await Assert.That(result.GetBoolean(0)).IsTrue(); // 1 == 1 + await Assert.That(result.GetBoolean(1)).IsFalse(); // 2 != 3 + await Assert.That(result.GetBoolean(2)).IsTrue(); // 3 == 3 + await Assert.That(result.GetBoolean(3)).IsFalse(); // 4 != 5 + await Assert.That(result.GetBoolean(4)).IsTrue(); // 5 == 5 + } + + [Test] + public async Task NotEqual_Int32_SameType() + { + // NumPy: np.array([1, 2, 3, 4, 5]) != np.array([1, 3, 3, 5, 5]) = [False, True, False, True, False] + var a = np.array(new[] { 1, 2, 3, 4, 5 }); + var b = np.array(new[] { 1, 3, 3, 5, 5 }); + var result = a != b; + + await Assert.That(result.GetBoolean(0)).IsFalse(); + await Assert.That(result.GetBoolean(1)).IsTrue(); + await Assert.That(result.GetBoolean(2)).IsFalse(); + await Assert.That(result.GetBoolean(3)).IsTrue(); + await Assert.That(result.GetBoolean(4)).IsFalse(); + } + + [Test] + public async Task Less_Int32_SameType() + { + // NumPy: np.array([1, 2, 3, 4, 5]) < np.array([1, 3, 3, 5, 5]) = [False, True, False, True, False] + var a = np.array(new[] { 1, 2, 3, 4, 5 }); + var b = np.array(new[] { 1, 3, 3, 5, 5 }); + var result = a < b; + + await Assert.That(result.GetBoolean(0)).IsFalse(); // 1 < 1 = False + await Assert.That(result.GetBoolean(1)).IsTrue(); // 2 < 3 = True + await Assert.That(result.GetBoolean(2)).IsFalse(); // 3 < 3 = False + await Assert.That(result.GetBoolean(3)).IsTrue(); // 4 < 5 = True + await Assert.That(result.GetBoolean(4)).IsFalse(); // 5 < 5 = False + } + + [Test] + public async Task Greater_Int32_SameType() + { + // NumPy: np.array([1, 2, 3, 4, 5]) > np.array([1, 3, 3, 5, 5]) = [False, False, False, False, False] + var a = np.array(new[] { 1, 2, 3, 4, 5 }); + var b = np.array(new[] { 1, 3, 3, 5, 5 }); + var result = a > b; + + await Assert.That(result.GetBoolean(0)).IsFalse(); + await Assert.That(result.GetBoolean(1)).IsFalse(); + await Assert.That(result.GetBoolean(2)).IsFalse(); + await Assert.That(result.GetBoolean(3)).IsFalse(); + await Assert.That(result.GetBoolean(4)).IsFalse(); + } + + [Test] + public async Task LessEqual_Int32_SameType() + { + // NumPy: np.array([1, 2, 3, 4, 5]) <= np.array([1, 3, 3, 5, 5]) = [True, True, True, True, True] + var a = np.array(new[] { 1, 2, 3, 4, 5 }); + var b = np.array(new[] { 1, 3, 3, 5, 5 }); + var result = a <= b; + + await Assert.That(result.GetBoolean(0)).IsTrue(); + await Assert.That(result.GetBoolean(1)).IsTrue(); + await Assert.That(result.GetBoolean(2)).IsTrue(); + await Assert.That(result.GetBoolean(3)).IsTrue(); + await Assert.That(result.GetBoolean(4)).IsTrue(); + } + + [Test] + public async Task GreaterEqual_Int32_SameType() + { + // NumPy: np.array([1, 2, 3, 4, 5]) >= np.array([1, 3, 3, 5, 5]) = [True, False, True, False, True] + var a = np.array(new[] { 1, 2, 3, 4, 5 }); + var b = np.array(new[] { 1, 3, 3, 5, 5 }); + var result = a >= b; + + await Assert.That(result.GetBoolean(0)).IsTrue(); + await Assert.That(result.GetBoolean(1)).IsFalse(); + await Assert.That(result.GetBoolean(2)).IsTrue(); + await Assert.That(result.GetBoolean(3)).IsFalse(); + await Assert.That(result.GetBoolean(4)).IsTrue(); + } + + #endregion + + #region Mixed Types Tests (Test 2) + + [Test] + public async Task Equal_MixedTypes_Int32_Float64() + { + // NumPy: np.array([1, 2, 3, 4], dtype=int32) == np.array([1.5, 2.0, 2.5, 4.0], dtype=float64) = [False, True, False, True] + var x = np.array(new[] { 1, 2, 3, 4 }); + var y = np.array(new[] { 1.5, 2.0, 2.5, 4.0 }); + var result = x == y; + + await Assert.That(result.GetBoolean(0)).IsFalse(); // 1 != 1.5 + await Assert.That(result.GetBoolean(1)).IsTrue(); // 2 == 2.0 + await Assert.That(result.GetBoolean(2)).IsFalse(); // 3 != 2.5 + await Assert.That(result.GetBoolean(3)).IsTrue(); // 4 == 4.0 + } + + [Test] + public async Task Less_MixedTypes_Int32_Float64() + { + // NumPy: np.array([1, 2, 3, 4], dtype=int32) < np.array([1.5, 2.0, 2.5, 4.0], dtype=float64) = [True, False, False, False] + var x = np.array(new[] { 1, 2, 3, 4 }); + var y = np.array(new[] { 1.5, 2.0, 2.5, 4.0 }); + var result = x < y; + + await Assert.That(result.GetBoolean(0)).IsTrue(); // 1 < 1.5 + await Assert.That(result.GetBoolean(1)).IsFalse(); // 2 >= 2.0 + await Assert.That(result.GetBoolean(2)).IsFalse(); // 3 >= 2.5 + await Assert.That(result.GetBoolean(3)).IsFalse(); // 4 >= 4.0 + } + + [Test] + public async Task GreaterEqual_MixedTypes_Int32_Float64() + { + // NumPy: np.array([1, 2, 3, 4], dtype=int32) >= np.array([1.5, 2.0, 2.5, 4.0], dtype=float64) = [False, True, True, True] + var x = np.array(new[] { 1, 2, 3, 4 }); + var y = np.array(new[] { 1.5, 2.0, 2.5, 4.0 }); + var result = x >= y; + + await Assert.That(result.GetBoolean(0)).IsFalse(); // 1 < 1.5 + await Assert.That(result.GetBoolean(1)).IsTrue(); // 2 >= 2.0 + await Assert.That(result.GetBoolean(2)).IsTrue(); // 3 >= 2.5 + await Assert.That(result.GetBoolean(3)).IsTrue(); // 4 >= 4.0 + } + + #endregion + + #region Broadcasting Tests (Test 3) + + [Test] + public async Task Greater_Broadcasting_2D_vs_1D() + { + // NumPy: arr2d = [[1, 2, 3], [4, 5, 6]], arr1d = [2, 3, 4] + // arr2d > arr1d = [[False, False, False], [True, True, True]] + var arr2d = np.array(new[,] { { 1, 2, 3 }, { 4, 5, 6 } }); + var arr1d = np.array(new[] { 2, 3, 4 }); + var result = arr2d > arr1d; + + // Row 0: [1>2, 2>3, 3>4] = [False, False, False] + await Assert.That(result.GetBoolean(0, 0)).IsFalse(); + await Assert.That(result.GetBoolean(0, 1)).IsFalse(); + await Assert.That(result.GetBoolean(0, 2)).IsFalse(); + + // Row 1: [4>2, 5>3, 6>4] = [True, True, True] + await Assert.That(result.GetBoolean(1, 0)).IsTrue(); + await Assert.That(result.GetBoolean(1, 1)).IsTrue(); + await Assert.That(result.GetBoolean(1, 2)).IsTrue(); + } + + [Test] + public async Task LessEqual_Broadcasting_2D_vs_1D() + { + // NumPy: arr2d <= arr1d = [[True, True, True], [False, False, False]] + var arr2d = np.array(new[,] { { 1, 2, 3 }, { 4, 5, 6 } }); + var arr1d = np.array(new[] { 2, 3, 4 }); + var result = arr2d <= arr1d; + + // Row 0: [1<=2, 2<=3, 3<=4] = [True, True, True] + await Assert.That(result.GetBoolean(0, 0)).IsTrue(); + await Assert.That(result.GetBoolean(0, 1)).IsTrue(); + await Assert.That(result.GetBoolean(0, 2)).IsTrue(); + + // Row 1: [4<=2, 5<=3, 6<=4] = [False, False, False] + await Assert.That(result.GetBoolean(1, 0)).IsFalse(); + await Assert.That(result.GetBoolean(1, 1)).IsFalse(); + await Assert.That(result.GetBoolean(1, 2)).IsFalse(); + } + + #endregion + + #region Scalar Comparison Tests (Test 4) + + [Test] + public async Task Greater_ScalarRight() + { + // NumPy: arr > 3 = [False, False, False, True, True] + var arr = np.array(new[] { 1.0, 2.0, 3.0, 4.0, 5.0 }); + var result = arr > 3; + + await Assert.That(result.GetBoolean(0)).IsFalse(); + await Assert.That(result.GetBoolean(1)).IsFalse(); + await Assert.That(result.GetBoolean(2)).IsFalse(); + await Assert.That(result.GetBoolean(3)).IsTrue(); + await Assert.That(result.GetBoolean(4)).IsTrue(); + } + + [Test] + public async Task LessEqual_ScalarRight() + { + // NumPy: arr <= 2.5 = [True, True, False, False, False] + var arr = np.array(new[] { 1.0, 2.0, 3.0, 4.0, 5.0 }); + var result = arr <= 2.5; + + await Assert.That(result.GetBoolean(0)).IsTrue(); + await Assert.That(result.GetBoolean(1)).IsTrue(); + await Assert.That(result.GetBoolean(2)).IsFalse(); + await Assert.That(result.GetBoolean(3)).IsFalse(); + await Assert.That(result.GetBoolean(4)).IsFalse(); + } + + [Test] + public async Task Equal_ScalarRight() + { + // NumPy: arr == 3.0 = [False, False, True, False, False] + var arr = np.array(new[] { 1.0, 2.0, 3.0, 4.0, 5.0 }); + var result = arr == 3.0; + + await Assert.That(result.GetBoolean(0)).IsFalse(); + await Assert.That(result.GetBoolean(1)).IsFalse(); + await Assert.That(result.GetBoolean(2)).IsTrue(); + await Assert.That(result.GetBoolean(3)).IsFalse(); + await Assert.That(result.GetBoolean(4)).IsFalse(); + } + + #endregion + + #region Boolean Comparison Tests (Test 5) + + [Test] + public async Task Equal_Boolean() + { + // NumPy: [True, True, False, False] == [True, False, True, False] = [True, False, False, True] + var a = np.array(new[] { true, true, false, false }); + var b = np.array(new[] { true, false, true, false }); + var result = a == b; + + await Assert.That(result.GetBoolean(0)).IsTrue(); + await Assert.That(result.GetBoolean(1)).IsFalse(); + await Assert.That(result.GetBoolean(2)).IsFalse(); + await Assert.That(result.GetBoolean(3)).IsTrue(); + } + + [Test] + public async Task NotEqual_Boolean() + { + // NumPy: [True, True, False, False] != [True, False, True, False] = [False, True, True, False] + var a = np.array(new[] { true, true, false, false }); + var b = np.array(new[] { true, false, true, false }); + var result = a != b; + + await Assert.That(result.GetBoolean(0)).IsFalse(); + await Assert.That(result.GetBoolean(1)).IsTrue(); + await Assert.That(result.GetBoolean(2)).IsTrue(); + await Assert.That(result.GetBoolean(3)).IsFalse(); + } + + [Test] + public async Task Less_Boolean() + { + // NumPy: [True, True, False, False] < [True, False, True, False] = [False, False, True, False] + // Note: In NumPy, False < True (False=0, True=1) + var a = np.array(new[] { true, true, false, false }); + var b = np.array(new[] { true, false, true, false }); + var result = a < b; + + await Assert.That(result.GetBoolean(0)).IsFalse(); // True < True = False + await Assert.That(result.GetBoolean(1)).IsFalse(); // True < False = False + await Assert.That(result.GetBoolean(2)).IsTrue(); // False < True = True + await Assert.That(result.GetBoolean(3)).IsFalse(); // False < False = False + } + + [Test] + public async Task Greater_Boolean() + { + // NumPy: [True, True, False, False] > [True, False, True, False] = [False, True, False, False] + var a = np.array(new[] { true, true, false, false }); + var b = np.array(new[] { true, false, true, false }); + var result = a > b; + + await Assert.That(result.GetBoolean(0)).IsFalse(); // True > True = False + await Assert.That(result.GetBoolean(1)).IsTrue(); // True > False = True + await Assert.That(result.GetBoolean(2)).IsFalse(); // False > True = False + await Assert.That(result.GetBoolean(3)).IsFalse(); // False > False = False + } + + #endregion + + #region Byte Comparison Tests (Test 6) + + [Test] + public async Task Equal_Byte() + { + // NumPy: np.array([0, 128, 255], dtype=uint8) == np.array([1, 128, 254], dtype=uint8) = [False, True, False] + var a = np.array(new byte[] { 0, 128, 255 }); + var b = np.array(new byte[] { 1, 128, 254 }); + var result = a == b; + + await Assert.That(result.GetBoolean(0)).IsFalse(); + await Assert.That(result.GetBoolean(1)).IsTrue(); + await Assert.That(result.GetBoolean(2)).IsFalse(); + } + + [Test] + public async Task Less_Byte() + { + // NumPy: np.array([0, 128, 255], dtype=uint8) < np.array([1, 128, 254], dtype=uint8) = [True, False, False] + var a = np.array(new byte[] { 0, 128, 255 }); + var b = np.array(new byte[] { 1, 128, 254 }); + var result = a < b; + + await Assert.That(result.GetBoolean(0)).IsTrue(); // 0 < 1 + await Assert.That(result.GetBoolean(1)).IsFalse(); // 128 >= 128 + await Assert.That(result.GetBoolean(2)).IsFalse(); // 255 > 254 + } + + #endregion + + #region Scalar vs Scalar Tests (Test 7) + + [Test] + public async Task Equal_ScalarVsScalar() + { + // NumPy: np.array(3) == np.array(5) = False (shape: ()) + var s1 = NDArray.Scalar(3); + var s2 = NDArray.Scalar(5); + var result = s1 == s2; + + await Assert.That(result.Shape.IsScalar).IsTrue(); + await Assert.That(result.GetBoolean()).IsFalse(); + } + + [Test] + public async Task Less_ScalarVsScalar() + { + // NumPy: np.array(3) < np.array(5) = True + var s1 = NDArray.Scalar(3); + var s2 = NDArray.Scalar(5); + var result = s1 < s2; + + await Assert.That(result.Shape.IsScalar).IsTrue(); + await Assert.That(result.GetBoolean()).IsTrue(); + } + + [Test] + public async Task GreaterEqual_ScalarVsScalar() + { + // NumPy: np.array(3) >= np.array(5) = False + var s1 = NDArray.Scalar(3); + var s2 = NDArray.Scalar(5); + var result = s1 >= s2; + + await Assert.That(result.Shape.IsScalar).IsTrue(); + await Assert.That(result.GetBoolean()).IsFalse(); + } + + #endregion + + #region Float Edge Cases Tests (Test 8) + + [Test] + public async Task Equal_FloatWithNaN() + { + // NumPy: [1.0, nan, inf, -inf, 0.0] == [1.0, nan, inf, -inf, 0.0] = [True, False, True, True, True] + // NaN != NaN by IEEE 754 standard + var floats = np.array(new[] { 1.0, double.NaN, double.PositiveInfinity, double.NegativeInfinity, 0.0 }); + var result = floats == floats; + + await Assert.That(result.GetBoolean(0)).IsTrue(); // 1.0 == 1.0 + await Assert.That(result.GetBoolean(1)).IsFalse(); // NaN != NaN (IEEE 754) + await Assert.That(result.GetBoolean(2)).IsTrue(); // Inf == Inf + await Assert.That(result.GetBoolean(3)).IsTrue(); // -Inf == -Inf + await Assert.That(result.GetBoolean(4)).IsTrue(); // 0.0 == 0.0 + } + + [Test] + public async Task Less_FloatWithInfinity() + { + // NumPy: [1.0, nan, inf, -inf, 0.0] < 1.0 = [False, False, False, True, True] + var floats = np.array(new[] { 1.0, double.NaN, double.PositiveInfinity, double.NegativeInfinity, 0.0 }); + var result = floats < 1.0; + + await Assert.That(result.GetBoolean(0)).IsFalse(); // 1.0 < 1.0 = False + await Assert.That(result.GetBoolean(1)).IsFalse(); // NaN < anything = False + await Assert.That(result.GetBoolean(2)).IsFalse(); // Inf < 1.0 = False + await Assert.That(result.GetBoolean(3)).IsTrue(); // -Inf < 1.0 = True + await Assert.That(result.GetBoolean(4)).IsTrue(); // 0.0 < 1.0 = True + } + + #endregion + + #region All dtypes tests + + [Test] + public async Task Equal_Int16() + { + var a = np.array(new short[] { 1, 2, 3 }); + var b = np.array(new short[] { 1, 3, 3 }); + var result = a == b; + + await Assert.That(result.GetBoolean(0)).IsTrue(); + await Assert.That(result.GetBoolean(1)).IsFalse(); + await Assert.That(result.GetBoolean(2)).IsTrue(); + } + + [Test] + public async Task Equal_UInt16() + { + var a = np.array(new ushort[] { 1, 2, 3 }); + var b = np.array(new ushort[] { 1, 3, 3 }); + var result = a == b; + + await Assert.That(result.GetBoolean(0)).IsTrue(); + await Assert.That(result.GetBoolean(1)).IsFalse(); + await Assert.That(result.GetBoolean(2)).IsTrue(); + } + + [Test] + public async Task Equal_UInt32() + { + var a = np.array(new uint[] { 1, 2, 3 }); + var b = np.array(new uint[] { 1, 3, 3 }); + var result = a == b; + + await Assert.That(result.GetBoolean(0)).IsTrue(); + await Assert.That(result.GetBoolean(1)).IsFalse(); + await Assert.That(result.GetBoolean(2)).IsTrue(); + } + + [Test] + public async Task Equal_Int64() + { + var a = np.array(new long[] { 1, 2, 3 }); + var b = np.array(new long[] { 1, 3, 3 }); + var result = a == b; + + await Assert.That(result.GetBoolean(0)).IsTrue(); + await Assert.That(result.GetBoolean(1)).IsFalse(); + await Assert.That(result.GetBoolean(2)).IsTrue(); + } + + [Test] + public async Task Equal_UInt64() + { + var a = np.array(new ulong[] { 1, 2, 3 }); + var b = np.array(new ulong[] { 1, 3, 3 }); + var result = a == b; + + await Assert.That(result.GetBoolean(0)).IsTrue(); + await Assert.That(result.GetBoolean(1)).IsFalse(); + await Assert.That(result.GetBoolean(2)).IsTrue(); + } + + [Test] + public async Task Equal_Single() + { + var a = np.array(new float[] { 1.0f, 2.0f, 3.0f }); + var b = np.array(new float[] { 1.0f, 3.0f, 3.0f }); + var result = a == b; + + await Assert.That(result.GetBoolean(0)).IsTrue(); + await Assert.That(result.GetBoolean(1)).IsFalse(); + await Assert.That(result.GetBoolean(2)).IsTrue(); + } + + [Test] + public async Task Equal_Decimal() + { + var a = np.array(new decimal[] { 1.0m, 2.0m, 3.0m }); + var b = np.array(new decimal[] { 1.0m, 3.0m, 3.0m }); + var result = a == b; + + await Assert.That(result.GetBoolean(0)).IsTrue(); + await Assert.That(result.GetBoolean(1)).IsFalse(); + await Assert.That(result.GetBoolean(2)).IsTrue(); + } + + [Test] + public async Task Equal_Char() + { + var a = np.array(new char[] { 'a', 'b', 'c' }); + var b = np.array(new char[] { 'a', 'x', 'c' }); + var result = a == b; + + await Assert.That(result.GetBoolean(0)).IsTrue(); + await Assert.That(result.GetBoolean(1)).IsFalse(); + await Assert.That(result.GetBoolean(2)).IsTrue(); + } + + #endregion +} diff --git a/test/NumSharp.UnitTest/Backends/Kernels/EdgeCaseTests.cs b/test/NumSharp.UnitTest/Backends/Kernels/EdgeCaseTests.cs new file mode 100644 index 00000000..35a7dcf6 --- /dev/null +++ b/test/NumSharp.UnitTest/Backends/Kernels/EdgeCaseTests.cs @@ -0,0 +1,921 @@ +using System; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using NumSharp; +using NumSharp.UnitTest.Utilities; +using TUnit.Core; + +namespace NumSharp.UnitTest.Backends.Kernels; + +/// +/// Edge case tests discovered through NumPy battle testing. +/// All expected values are verified against NumPy 2.x output. +/// +public class EdgeCaseTests +{ + #region Modulo Edge Cases - Python vs C Semantics + + [Test] + [OpenBugs] // NumSharp likely uses C semantics, NumPy uses Python semantics + public void Mod_NegativeDividend_PythonSemantics() + { + // NumPy: -7 % 3 = 2 (Python semantics: result has same sign as divisor) + // C#: -7 % 3 = -1 (C semantics: result has same sign as dividend) + var a = np.array(new[] { -7 }); + var b = np.array(new[] { 3 }); + + var result = a % b; + + Assert.AreEqual(2, result.GetInt32(0), "NumPy uses Python modulo semantics"); + } + + [Test] + [OpenBugs] // NumSharp likely uses C semantics + public void Mod_NegativeDivisor_PythonSemantics() + { + // NumPy: 7 % -3 = -2 (Python semantics) + // C#: 7 % -3 = 1 (C semantics) + var a = np.array(new[] { 7 }); + var b = np.array(new[] { -3 }); + + var result = a % b; + + Assert.AreEqual(-2, result.GetInt32(0), "NumPy uses Python modulo semantics"); + } + + [Test] + public void Mod_BothNegative() + { + // NumPy: -7 % -3 = -1 (both semantics agree here) + var a = np.array(new[] { -7 }); + var b = np.array(new[] { -3 }); + + var result = a % b; + + Assert.AreEqual(-1, result.GetInt32(0)); + } + + [Test] + public void Mod_Float_ByZero() + { + // NumPy: 5.0 % 0.0 = NaN + var a = np.array(new[] { 5.0 }); + var b = np.array(new[] { 0.0 }); + + var result = a % b; + + Assert.IsTrue(double.IsNaN(result.GetDouble(0))); + } + + #endregion + + #region Absolute Value Edge Cases + + [Test] + [OpenBugs] // Int8 abs overflow is a known edge case + public void Abs_Int8_MinValue_Overflow() + { + // NumPy: np.abs(np.int8(-128)) = -128 (overflow, returns same value!) + // This is expected behavior - abs of MIN_VALUE for signed ints overflows + var a = np.array(new sbyte[] { -128 }); + + var result = np.abs(a); + + // NumPy actually returns -128 due to overflow + Assert.AreEqual(-128, (sbyte)result.GetByte(0), "abs(MIN_VALUE) overflows to MIN_VALUE"); + } + + [Test] + public void Abs_NegativeZero() + { + // NumPy: np.abs(-0.0) = 0.0 (positive zero) + var a = np.array(new[] { -0.0 }); + + var result = np.abs(a); + + Assert.AreEqual(0.0, result.GetDouble(0)); + // Note: Checking if it's positive zero vs negative zero is tricky + } + + [Test] + public void Abs_NegativeInfinity() + { + // NumPy: np.abs(-inf) = inf + var a = np.array(new[] { double.NegativeInfinity }); + + var result = np.abs(a); + + Assert.IsTrue(double.IsPositiveInfinity(result.GetDouble(0))); + } + + [Test] + public void Abs_NaN() + { + // NumPy: np.abs(nan) = nan + var a = np.array(new[] { double.NaN }); + + var result = np.abs(a); + + Assert.IsTrue(double.IsNaN(result.GetDouble(0))); + } + + #endregion + + #region Sign Edge Cases + + [Test] + [OpenBugs] // .NET Math.Sign(NaN) throws ArithmeticException + public void Sign_NaN_ReturnsNaN() + { + // NumPy: np.sign(nan) = nan + // .NET: Math.Sign(NaN) throws ArithmeticException + var a = np.array(new[] { double.NaN }); + + var result = np.sign(a); + + Assert.IsTrue(double.IsNaN(result.GetDouble(0))); + } + + [Test] + public void Sign_Infinity() + { + // NumPy: np.sign(inf) = 1.0, np.sign(-inf) = -1.0 + var a = np.array(new[] { double.PositiveInfinity, double.NegativeInfinity }); + + var result = np.sign(a); + + Assert.AreEqual(1.0, result.GetDouble(0)); + Assert.AreEqual(-1.0, result.GetDouble(1)); + } + + [Test] + public void Sign_Zero() + { + // NumPy: np.sign(0) = 0, np.sign(-0.0) = 0.0 + var a = np.array(new[] { 0.0, -0.0 }); + + var result = np.sign(a); + + Assert.AreEqual(0.0, result.GetDouble(0)); + Assert.AreEqual(0.0, result.GetDouble(1)); + } + + [Test] + [OpenBugs] // sbyte array sign operations fail + public void Sign_PreservesIntegerType() + { + // NumPy: np.sign(int8) returns int8 + var a = np.array(new sbyte[] { -5, 0, 5 }); + + var result = np.sign(a); + + // NumSharp might not preserve exact integer types for sign + Assert.AreEqual(-1, result.GetInt32(0)); + Assert.AreEqual(0, result.GetInt32(1)); + Assert.AreEqual(1, result.GetInt32(2)); + } + + #endregion + + #region Negative Edge Cases + + [Test] + [OpenBugs] // NumSharp throws NotSupportedException for unsigned types + public void Negative_UInt8_Wraps() + { + // NumPy: np.negative(np.uint8(1)) = 255 (wraps) + // NumPy: np.negative(np.uint8(5)) = 251 + // NumPy: np.negative(np.uint8(0)) = 0 + var a = np.array(new byte[] { 1, 5, 0 }); + + var result = np.negative(a); + + Assert.AreEqual(255, result.GetByte(0)); + Assert.AreEqual(251, result.GetByte(1)); + Assert.AreEqual(0, result.GetByte(2)); + } + + [Test] + public void Negative_NegativeZero() + { + // NumPy: np.negative(-0.0) = 0.0 (becomes positive zero) + var a = np.array(new[] { -0.0 }); + + var result = np.negative(a); + + Assert.AreEqual(0.0, result.GetDouble(0)); + } + + [Test] + public void Negative_Infinity() + { + // NumPy: np.negative(inf) = -inf + var a = np.array(new[] { double.PositiveInfinity }); + + var result = np.negative(a); + + Assert.IsTrue(double.IsNegativeInfinity(result.GetDouble(0))); + } + + [Test] + public void Negative_NaN() + { + // NumPy: np.negative(nan) = nan + var a = np.array(new[] { double.NaN }); + + var result = np.negative(a); + + Assert.IsTrue(double.IsNaN(result.GetDouble(0))); + } + + #endregion + + #region Integer Overflow Edge Cases + + [Test] + [OpenBugs] // sbyte array operations may not work correctly + public void Add_Int8_Overflow_Wraps() + { + // NumPy: np.int8(127) + np.int8(1) = -128 + var a = np.array(new sbyte[] { 127 }); + var b = np.array(new sbyte[] { 1 }); + + var result = a + b; + + Assert.AreEqual(-128, (sbyte)result.GetByte(0)); + } + + [Test] + [OpenBugs] // sbyte array operations may not work correctly + public void Subtract_Int8_Underflow_Wraps() + { + // NumPy: np.int8(-128) - np.int8(1) = 127 + var a = np.array(new sbyte[] { -128 }); + var b = np.array(new sbyte[] { 1 }); + + var result = a - b; + + Assert.AreEqual(127, (sbyte)result.GetByte(0)); + } + + [Test] + public void Add_UInt8_Overflow_Wraps() + { + // NumPy: np.uint8(255) + np.uint8(1) = 0 + var a = np.array(new byte[] { 255 }); + var b = np.array(new byte[] { 1 }); + + var result = a + b; + + Assert.AreEqual(0, result.GetByte(0)); + } + + [Test] + public void Subtract_UInt8_Underflow_Wraps() + { + // NumPy: np.uint8(0) - np.uint8(1) = 255 + var a = np.array(new byte[] { 0 }); + var b = np.array(new byte[] { 1 }); + + var result = a - b; + + Assert.AreEqual(255, result.GetByte(0)); + } + + [Test] + [OpenBugs] // sbyte array operations may not work correctly + public void Multiply_Int8_Overflow_Wraps() + { + // NumPy: np.int8(100) * np.int8(2) = -56 + var a = np.array(new sbyte[] { 100 }); + var b = np.array(new sbyte[] { 2 }); + + var result = a * b; + + Assert.AreEqual(-56, (sbyte)result.GetByte(0)); + } + + #endregion + + #region Division Edge Cases + + [Test] + public void Divide_Float_ByPositiveZero() + { + // NumPy: 1.0 / 0.0 = inf + var a = np.array(new[] { 1.0 }); + var b = np.array(new[] { 0.0 }); + + var result = a / b; + + Assert.IsTrue(double.IsPositiveInfinity(result.GetDouble(0))); + } + + [Test] + public void Divide_Float_ByNegativeZero() + { + // NumPy: 1.0 / -0.0 = -inf + var a = np.array(new[] { 1.0 }); + var b = np.array(new[] { -0.0 }); + + var result = a / b; + + Assert.IsTrue(double.IsNegativeInfinity(result.GetDouble(0))); + } + + [Test] + public void Divide_ZeroByZero() + { + // NumPy: 0.0 / 0.0 = nan + var a = np.array(new[] { 0.0 }); + var b = np.array(new[] { 0.0 }); + + var result = a / b; + + Assert.IsTrue(double.IsNaN(result.GetDouble(0))); + } + + [Test] + public void Divide_InfinityByInfinity() + { + // NumPy: inf / inf = nan + var a = np.array(new[] { double.PositiveInfinity }); + var b = np.array(new[] { double.PositiveInfinity }); + + var result = a / b; + + Assert.IsTrue(double.IsNaN(result.GetDouble(0))); + } + + [Test] + public void Divide_ZeroByInfinity() + { + // NumPy: 0.0 / inf = 0.0 + var a = np.array(new[] { 0.0 }); + var b = np.array(new[] { double.PositiveInfinity }); + + var result = a / b; + + Assert.AreEqual(0.0, result.GetDouble(0)); + } + + #endregion + + #region Infinity Arithmetic Edge Cases + + [Test] + public void Subtract_InfinityFromInfinity() + { + // NumPy: inf - inf = nan + var a = np.array(new[] { double.PositiveInfinity }); + var b = np.array(new[] { double.PositiveInfinity }); + + var result = a - b; + + Assert.IsTrue(double.IsNaN(result.GetDouble(0))); + } + + [Test] + public void Multiply_InfinityByZero() + { + // NumPy: inf * 0 = nan + var a = np.array(new[] { double.PositiveInfinity }); + var b = np.array(new[] { 0.0 }); + + var result = a * b; + + Assert.IsTrue(double.IsNaN(result.GetDouble(0))); + } + + [Test] + public void Add_InfinityPlusOne() + { + // NumPy: inf + 1 = inf + var a = np.array(new[] { double.PositiveInfinity }); + var b = np.array(new[] { 1.0 }); + + var result = a + b; + + Assert.IsTrue(double.IsPositiveInfinity(result.GetDouble(0))); + } + + [Test] + public void Add_NegativeInfinityPlusInfinity() + { + // NumPy: -inf + inf = nan + var a = np.array(new[] { double.NegativeInfinity }); + var b = np.array(new[] { double.PositiveInfinity }); + + var result = a + b; + + Assert.IsTrue(double.IsNaN(result.GetDouble(0))); + } + + #endregion + + #region Trig Function Edge Cases + + [Test] + public void Sin_Infinity() + { + // NumPy: np.sin(inf) = nan + var a = np.array(new[] { double.PositiveInfinity }); + + var result = np.sin(a); + + Assert.IsTrue(double.IsNaN(result.GetDouble(0))); + } + + [Test] + public void Cos_Infinity() + { + // NumPy: np.cos(inf) = nan + var a = np.array(new[] { double.PositiveInfinity }); + + var result = np.cos(a); + + Assert.IsTrue(double.IsNaN(result.GetDouble(0))); + } + + [Test] + public void ArcSin_OutOfRange() + { + // NumPy: np.arcsin(2) = nan + var a = np.array(new[] { 2.0 }); + + var result = np.arcsin(a); + + Assert.IsTrue(double.IsNaN(result.GetDouble(0))); + } + + [Test] + public void ArcTan_Infinity() + { + // NumPy: np.arctan(inf) = pi/2 + var a = np.array(new[] { double.PositiveInfinity, double.NegativeInfinity }); + + var result = np.arctan(a); + + Assert.AreEqual(Math.PI / 2, result.GetDouble(0), 1e-10); + Assert.AreEqual(-Math.PI / 2, result.GetDouble(1), 1e-10); + } + + #endregion + + #region Log/Exp Edge Cases + + [Test] + public void Log_Zero() + { + // NumPy: np.log(0) = -inf + var a = np.array(new[] { 0.0 }); + + var result = np.log(a); + + Assert.IsTrue(double.IsNegativeInfinity(result.GetDouble(0))); + } + + [Test] + public void Log_Negative() + { + // NumPy: np.log(-1) = nan + var a = np.array(new[] { -1.0 }); + + var result = np.log(a); + + Assert.IsTrue(double.IsNaN(result.GetDouble(0))); + } + + [Test] + public void Log1p_MinusOne() + { + // NumPy: np.log1p(-1) = -inf + var a = np.array(new[] { -1.0 }); + + var result = np.log1p(a); + + Assert.IsTrue(double.IsNegativeInfinity(result.GetDouble(0))); + } + + [Test] + public void Log1p_LessThanMinusOne() + { + // NumPy: np.log1p(-2) = nan + var a = np.array(new[] { -2.0 }); + + var result = np.log1p(a); + + Assert.IsTrue(double.IsNaN(result.GetDouble(0))); + } + + [Test] + public void Exp_NegativeInfinity() + { + // NumPy: np.exp(-inf) = 0 + var a = np.array(new[] { double.NegativeInfinity }); + + var result = np.exp(a); + + Assert.AreEqual(0.0, result.GetDouble(0)); + } + + [Test] + public void Expm1_NegativeInfinity() + { + // NumPy: np.expm1(-inf) = -1 + var a = np.array(new[] { double.NegativeInfinity }); + + var result = np.expm1(a); + + Assert.AreEqual(-1.0, result.GetDouble(0)); + } + + [Test] + public void Exp2_NegativeInfinity() + { + // NumPy: np.exp2(-inf) = 0 + var a = np.array(new[] { double.NegativeInfinity }); + + var result = np.exp2(a); + + Assert.AreEqual(0.0, result.GetDouble(0)); + } + + #endregion + + #region Sqrt Edge Cases + + [Test] + public void Sqrt_Negative() + { + // NumPy: np.sqrt(-1) = nan + var a = np.array(new[] { -1.0 }); + + var result = np.sqrt(a); + + Assert.IsTrue(double.IsNaN(result.GetDouble(0))); + } + + [Test] + public void Sqrt_NegativeInfinity() + { + // NumPy: np.sqrt(-inf) = nan + var a = np.array(new[] { double.NegativeInfinity }); + + var result = np.sqrt(a); + + Assert.IsTrue(double.IsNaN(result.GetDouble(0))); + } + + [Test] + public void Sqrt_PositiveInfinity() + { + // NumPy: np.sqrt(inf) = inf + var a = np.array(new[] { double.PositiveInfinity }); + + var result = np.sqrt(a); + + Assert.IsTrue(double.IsPositiveInfinity(result.GetDouble(0))); + } + + #endregion + + #region Hyperbolic Edge Cases + + [Test] + public void Tanh_Infinity() + { + // NumPy: np.tanh(inf) = 1.0, np.tanh(-inf) = -1.0 + var a = np.array(new[] { double.PositiveInfinity, double.NegativeInfinity }); + + var result = np.tanh(a); + + Assert.AreEqual(1.0, result.GetDouble(0)); + Assert.AreEqual(-1.0, result.GetDouble(1)); + } + + [Test] + public void Tanh_LargeValue() + { + // NumPy: np.tanh(1000) = 1.0 (saturates to 1) + var a = np.array(new[] { 1000.0 }); + + var result = np.tanh(a); + + Assert.AreEqual(1.0, result.GetDouble(0)); + } + + [Test] + public void Sinh_Infinity() + { + // NumPy: np.sinh(inf) = inf, np.sinh(-inf) = -inf + var a = np.array(new[] { double.PositiveInfinity, double.NegativeInfinity }); + + var result = np.sinh(a); + + Assert.IsTrue(double.IsPositiveInfinity(result.GetDouble(0))); + Assert.IsTrue(double.IsNegativeInfinity(result.GetDouble(1))); + } + + [Test] + public void Cosh_Infinity() + { + // NumPy: np.cosh(inf) = inf (both +inf and -inf give +inf) + var a = np.array(new[] { double.PositiveInfinity, double.NegativeInfinity }); + + var result = np.cosh(a); + + Assert.IsTrue(double.IsPositiveInfinity(result.GetDouble(0))); + Assert.IsTrue(double.IsPositiveInfinity(result.GetDouble(1))); + } + + #endregion + + #region Rounding Edge Cases (Banker's Rounding) + + [Test] + public void Round_HalfToEven_BankersRounding() + { + // NumPy uses banker's rounding: round half to even + // np.round(0.5) = 0, np.round(1.5) = 2, np.round(2.5) = 2, np.round(3.5) = 4 + var a = np.array(new[] { 0.5, 1.5, 2.5, 3.5, 4.5 }); + + var result = np.around(a); + + Assert.AreEqual(0.0, result.GetDouble(0)); // Half rounds to even (0) + Assert.AreEqual(2.0, result.GetDouble(1)); // Half rounds to even (2) + Assert.AreEqual(2.0, result.GetDouble(2)); // Half rounds to even (2) + Assert.AreEqual(4.0, result.GetDouble(3)); // Half rounds to even (4) + Assert.AreEqual(4.0, result.GetDouble(4)); // Half rounds to even (4) + } + + [Test] + public void Round_NegativeHalf() + { + // NumPy: np.round(-0.5) = -0.0, np.round(-1.5) = -2.0 + var a = np.array(new[] { -0.5, -1.5, -2.5 }); + + var result = np.around(a); + + Assert.AreEqual(0.0, result.GetDouble(0)); // Rounds to -0.0 (displays as 0.0) + Assert.AreEqual(-2.0, result.GetDouble(1)); // Half rounds to even (-2) + Assert.AreEqual(-2.0, result.GetDouble(2)); // Half rounds to even (-2) + } + + [Test] + public void Floor_Infinity() + { + // NumPy: np.floor(inf) = inf, np.floor(-inf) = -inf + var a = np.array(new[] { double.PositiveInfinity, double.NegativeInfinity }); + + var result = np.floor(a); + + Assert.IsTrue(double.IsPositiveInfinity(result.GetDouble(0))); + Assert.IsTrue(double.IsNegativeInfinity(result.GetDouble(1))); + } + + [Test] + public void Floor_NaN() + { + // NumPy: np.floor(nan) = nan + var a = np.array(new[] { double.NaN }); + + var result = np.floor(a); + + Assert.IsTrue(double.IsNaN(result.GetDouble(0))); + } + + [Test] + public void Ceil_NegativeHalf() + { + // NumPy: np.ceil(-0.5) = -0.0 + var a = np.array(new[] { -0.5 }); + + var result = np.ceil(a); + + Assert.AreEqual(0.0, result.GetDouble(0)); // -0.0 == 0.0 + } + + #endregion + + #region Empty Array Edge Cases + + [Test] + public void Sum_EmptyArray() + { + // NumPy: np.sum([]) = 0.0 + var a = np.array(new double[0]); + + var result = np.sum(a); + + Assert.AreEqual(0.0, result.GetDouble(0)); + } + + [Test] + public void Prod_EmptyArray() + { + // NumPy: np.prod([]) = 1.0 + var a = np.array(new double[0]); + + var result = np.prod(a); + + Assert.AreEqual(1.0, result.GetDouble(0)); + } + + [Test] + [OpenBugs] // Mean of empty array fails (should return NaN) + public void Mean_EmptyArray() + { + // NumPy: np.mean([]) = nan + var a = np.array(new double[0]); + + var result = np.mean(a); + + Assert.IsTrue(double.IsNaN(result.GetDouble(0))); + } + + [Test] + public void Cumsum_EmptyArray() + { + // NumPy: np.cumsum([]) = [] (empty array) + var a = np.array(new double[0]); + + var result = np.cumsum(a); + + Assert.AreEqual(0, result.size); + Assert.AreEqual(1, result.ndim); + } + + [Test] + public void Dot_EmptyArrays() + { + // NumPy: np.dot([], []) = 0.0 + var a = np.array(new double[0]); + var b = np.array(new double[0]); + + var result = np.dot(a, b); + + Assert.AreEqual(0.0, (double)result); + } + + #endregion + + #region Type Promotion Edge Cases + + [Test] + public void Add_Bool_ActsAsLogicalOr() + { + // NumPy: True + True = True (bool + bool stays bool, acts as OR) + var a = np.array(new[] { true }); + var b = np.array(new[] { true }); + + var result = a + b; + + Assert.AreEqual(NPTypeCode.Boolean, result.typecode); + Assert.IsTrue(result.GetBoolean(0)); + } + + [Test] + public void Add_Bool_False() + { + // NumPy: False + False = False + var a = np.array(new[] { false }); + var b = np.array(new[] { false }); + + var result = a + b; + + Assert.AreEqual(NPTypeCode.Boolean, result.typecode); + Assert.IsFalse(result.GetBoolean(0)); + } + + [Test] + public void Multiply_Bool_ActsAsLogicalAnd() + { + // NumPy: True * False = False (bool * bool stays bool, acts as AND) + var a = np.array(new[] { true }); + var b = np.array(new[] { false }); + + var result = a * b; + + Assert.AreEqual(NPTypeCode.Boolean, result.typecode); + Assert.IsFalse(result.GetBoolean(0)); + } + + [Test] + public void Multiply_Bool_WithInt() + { + // NumPy: True * 5 = 5 (promotes to int64) + var a = np.array(new[] { true }); + var b = np.array(new[] { 5 }); + + var result = a * b; + + Assert.AreEqual(5, result.GetInt32(0)); + } + + [Test] + public void Add_UInt64_Int64_PromotesToFloat64() + { + // NumPy: uint64 + int64 = float64 (can't safely fit in either) + var a = np.array(new ulong[] { 1 }); + var b = np.array(new long[] { 1 }); + + var result = a + b; + + // NumPy promotes to float64 in this case + Assert.AreEqual(NPTypeCode.Double, result.typecode); + } + + #endregion + + #region NaN Comparison Edge Cases + + [Test] + public void Equal_NaN_NaN_IsFalse() + { + // NumPy: nan == nan -> False (IEEE 754) + var a = np.array(new[] { double.NaN }); + var b = np.array(new[] { double.NaN }); + + var result = a == b; + + Assert.IsFalse(result.GetBoolean(0)); + } + + [Test] + public void NotEqual_NaN_NaN_IsTrue() + { + // NumPy: nan != nan -> True (IEEE 754) + var a = np.array(new[] { double.NaN }); + var b = np.array(new[] { double.NaN }); + + var result = a != b; + + Assert.IsTrue(result.GetBoolean(0)); + } + + [Test] + public void LessThan_NaN_IsFalse() + { + // NumPy: nan < anything -> False + var a = np.array(new[] { double.NaN }); + var b = np.array(new[] { 0.0 }); + + var result = a < b; + + Assert.IsFalse(result.GetBoolean(0)); + } + + [Test] + public void GreaterThan_NaN_IsFalse() + { + // NumPy: nan > anything -> False + var a = np.array(new[] { double.NaN }); + var b = np.array(new[] { 0.0 }); + + var result = a > b; + + Assert.IsFalse(result.GetBoolean(0)); + } + + #endregion + + #region Infinity Comparison Edge Cases + + [Test] + public void Equal_Infinity_Infinity_IsTrue() + { + // NumPy: inf == inf -> True + var a = np.array(new[] { double.PositiveInfinity }); + var b = np.array(new[] { double.PositiveInfinity }); + + var result = a == b; + + Assert.IsTrue(result.GetBoolean(0)); + } + + [Test] + public void GreaterThan_Infinity_Infinity_IsFalse() + { + // NumPy: inf > inf -> False + var a = np.array(new[] { double.PositiveInfinity }); + var b = np.array(new[] { double.PositiveInfinity }); + + var result = a > b; + + Assert.IsFalse(result.GetBoolean(0)); + } + + [Test] + public void GreaterThanOrEqual_Infinity_Infinity_IsTrue() + { + // NumPy: inf >= inf -> True + var a = np.array(new[] { double.PositiveInfinity }); + var b = np.array(new[] { double.PositiveInfinity }); + + var result = a >= b; + + Assert.IsTrue(result.GetBoolean(0)); + } + + #endregion +} diff --git a/test/NumSharp.UnitTest/Backends/Kernels/IndexingEdgeCaseTests.cs b/test/NumSharp.UnitTest/Backends/Kernels/IndexingEdgeCaseTests.cs new file mode 100644 index 00000000..78ad5f57 --- /dev/null +++ b/test/NumSharp.UnitTest/Backends/Kernels/IndexingEdgeCaseTests.cs @@ -0,0 +1,382 @@ +using System; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using NumSharp; +using NumSharp.UnitTest.Utilities; +using TUnit.Core; + +namespace NumSharp.UnitTest.Backends.Kernels; + +/// +/// Edge case tests for array indexing operations. +/// All expected values are verified against NumPy 2.x output. +/// +public class IndexingEdgeCaseTests +{ + #region Negative Indexing + + [Test] + public void NegativeIndex_Last() + { + // NumPy: arr[-1] = 5 + var arr = np.array(new[] { 1, 2, 3, 4, 5 }); + + Assert.AreEqual(5, arr[-1].GetInt32(0)); + } + + [Test] + public void NegativeIndex_First() + { + // NumPy: arr[-5] = 1 (same as arr[0] for 5-element array) + var arr = np.array(new[] { 1, 2, 3, 4, 5 }); + + Assert.AreEqual(1, arr[-5].GetInt32(0)); + } + + [Test] + public void NegativeSlice_LastN() + { + // NumPy: arr[-3:] = [3, 4, 5] + var arr = np.array(new[] { 1, 2, 3, 4, 5 }); + + var result = arr["-3:"]; + + result.Should().BeOfValues(3, 4, 5); + } + + [Test] + public void NegativeSlice_ExcludeLastN() + { + // NumPy: arr[:-3] = [1, 2] + var arr = np.array(new[] { 1, 2, 3, 4, 5 }); + + var result = arr[":-3"]; + + result.Should().BeOfValues(1, 2); + } + + [Test] + public void NegativeSlice_Range() + { + // NumPy: arr[-4:-1] = [2, 3, 4] + var arr = np.array(new[] { 1, 2, 3, 4, 5 }); + + var result = arr["-4:-1"]; + + result.Should().BeOfValues(2, 3, 4); + } + + [Test] + public void NegativeSlice_ReversePartial() + { + // NumPy: arr[-1:-4:-1] = [5, 4, 3] + var arr = np.array(new[] { 1, 2, 3, 4, 5 }); + + var result = arr["-1:-4:-1"]; + + result.Should().BeOfValues(5, 4, 3); + } + + [Test] + public void NegativeSlice_2D_Corner() + { + // NumPy: arr2d[-2:, -2:] = [[6,7], [10,11]] + var arr = np.arange(12).reshape(3, 4); + + var result = arr["-2:, -2:"]; + + Assert.AreEqual(2, result.shape[0]); + Assert.AreEqual(2, result.shape[1]); + Assert.AreEqual(6, result.GetInt32(0, 0)); + Assert.AreEqual(11, result.GetInt32(1, 1)); + } + + [Test] + public void NegativeSlice_2D_FullReverse() + { + // NumPy: arr2d[::-1, ::-1] reverses both axes + var arr = np.arange(12).reshape(3, 4); + + var result = arr["::-1, ::-1"]; + + Assert.AreEqual(11, result.GetInt32(0, 0)); + Assert.AreEqual(0, result.GetInt32(2, 3)); + } + + #endregion + + #region Boolean Indexing + + [Test] + [OpenBugs] // Boolean indexing returns incorrect results + public void BooleanIndex_Simple() + { + // NumPy: arr[mask] = [1, 3, 5] + var arr = np.array(new[] { 1, 2, 3, 4, 5, 6 }); + var mask = np.array(new[] { true, false, true, false, true, false }); + + var result = arr[mask]; + + result.Should().BeOfValues(1, 3, 5); + } + + [Test] + public void BooleanIndex_Condition() + { + // NumPy: arr[arr > 3] = [4, 5, 6] + var arr = np.array(new[] { 1, 2, 3, 4, 5, 6 }); + + var result = arr[arr > 3]; + + result.Should().BeOfValues(4, 5, 6); + } + + [Test] + public void BooleanIndex_EvenNumbers() + { + // NumPy: arr[arr % 2 == 0] = [2, 4, 6] + var arr = np.array(new[] { 1, 2, 3, 4, 5, 6 }); + + var result = arr[arr % 2 == 0]; + + result.Should().BeOfValues(2, 4, 6); + } + + [Test] + public void BooleanIndex_2D_Flattens() + { + // NumPy: arr2d[arr2d > 5] = [6, 7, 8, 9, 10, 11] (flattened!) + var arr = np.arange(12).reshape(3, 4); + + var result = arr[arr > 5]; + + Assert.AreEqual(1, result.ndim); // Flattened to 1D + Assert.AreEqual(6, result.size); + Assert.AreEqual(6, result.GetInt32(0)); + } + + [Test] + [OpenBugs] // Boolean row selection fails + public void BooleanIndex_RowSelection() + { + // NumPy: arr2d[[True, False, True]] selects rows 0 and 2 + var arr = np.arange(12).reshape(3, 4); + var rowMask = np.array(new[] { true, false, true }); + + var result = arr[rowMask]; + + Assert.AreEqual(2, result.shape[0]); + Assert.AreEqual(4, result.shape[1]); + Assert.AreEqual(0, result.GetInt32(0, 0)); + Assert.AreEqual(8, result.GetInt32(1, 0)); + } + + #endregion + + #region Fancy Indexing + + [Test] + public void FancyIndex_Simple() + { + // NumPy: arr[[0, 2, 4]] = [10, 30, 50] + var arr = np.array(new[] { 10, 20, 30, 40, 50 }); + var indices = np.array(new[] { 0, 2, 4 }); + + var result = arr[indices]; + + result.Should().BeOfValues(10, 30, 50); + } + + [Test] + public void FancyIndex_NegativeIndices() + { + // NumPy: arr[[-1, -3, -5]] = [50, 30, 10] + var arr = np.array(new[] { 10, 20, 30, 40, 50 }); + var indices = np.array(new[] { -1, -3, -5 }); + + var result = arr[indices]; + + result.Should().BeOfValues(50, 30, 10); + } + + [Test] + public void FancyIndex_Repeated() + { + // NumPy: arr[[0, 0, 1, 1, 2]] = [10, 10, 20, 20, 30] + var arr = np.array(new[] { 10, 20, 30, 40, 50 }); + var indices = np.array(new[] { 0, 0, 1, 1, 2 }); + + var result = arr[indices]; + + result.Should().BeOfValues(10, 10, 20, 20, 30); + } + + [Test] + public void FancyIndex_2D_Diagonal() + { + // NumPy: arr2d[[0,1,2], [0,1,2]] = [0, 5, 10] (diagonal) + var arr = np.arange(12).reshape(3, 4); + var rowIdx = np.array(new[] { 0, 1, 2 }); + var colIdx = np.array(new[] { 0, 1, 2 }); + + var result = arr[rowIdx, colIdx]; + + result.Should().BeOfValues(0, 5, 10); + } + + #endregion + + #region Ellipsis + + [Test] + public void Ellipsis_3D_Last() + { + // NumPy: arr3d[..., 0].shape = (2, 3) + var arr = np.arange(24).reshape(2, 3, 4); + + var result = arr["..., 0"]; + + Assert.AreEqual(2, result.ndim); + Assert.AreEqual(2, result.shape[0]); + Assert.AreEqual(3, result.shape[1]); + } + + [Test] + public void Ellipsis_3D_First() + { + // NumPy: arr3d[0, ...].shape = (3, 4) + var arr = np.arange(24).reshape(2, 3, 4); + + var result = arr["0, ..."]; + + Assert.AreEqual(2, result.ndim); + Assert.AreEqual(3, result.shape[0]); + Assert.AreEqual(4, result.shape[1]); + } + + #endregion + + #region Combined Indexing + + [Test] + public void Combined_SliceAndInteger() + { + // NumPy: arr2d[1:, 0] = [4, 8] + var arr = np.arange(12).reshape(3, 4); + + var result = arr["1:, 0"]; + + Assert.AreEqual(1, result.ndim); + result.Should().BeOfValues(4, 8); + } + + [Test] + public void Combined_IntegerAndSlice() + { + // NumPy: arr2d[0, 1:3] = [1, 2] + var arr = np.arange(12).reshape(3, 4); + + var result = arr["0, 1:3"]; + + Assert.AreEqual(1, result.ndim); + result.Should().BeOfValues(1, 2); + } + + #endregion + + #region Indexing Assignment + + [Test] + public void Assignment_SingleElement() + { + var arr = np.array(new[] { 1, 2, 3, 4, 5 }); + + arr[2] = 100; + + arr.Should().BeOfValues(1, 2, 100, 4, 5); + } + + [Test] + public void Assignment_Slice() + { + var arr = np.array(new[] { 1, 2, 3, 4, 5 }); + + arr["1:4"] = np.array(new[] { 10, 20, 30 }); + + arr.Should().BeOfValues(1, 10, 20, 30, 5); + } + + [Test] + public void Assignment_SliceWithScalar() + { + var arr = np.array(new[] { 1, 2, 3, 4, 5 }); + + arr["1:4"] = 99; + + arr.Should().BeOfValues(1, 99, 99, 99, 5); + } + + [Test] + [OpenBugs] // Fancy index assignment silently no-ops + public void Assignment_FancyIndex() + { + // NumPy: arr[[0, 2, 4]] = 99 -> [99, 2, 99, 4, 99] + var arr = np.array(new[] { 1, 2, 3, 4, 5 }); + var indices = np.array(new[] { 0, 2, 4 }); + + arr[indices] = 99; + + arr.Should().BeOfValues(99, 2, 99, 4, 99); + } + + [Test] + [OpenBugs] // Boolean mask assignment silently no-ops + public void Assignment_BooleanMask() + { + // NumPy: arr[arr > 3] = 0 -> [1, 2, 3, 0, 0] + var arr = np.array(new[] { 1, 2, 3, 4, 5 }); + + arr[arr > 3] = 0; + + arr.Should().BeOfValues(1, 2, 3, 0, 0); + } + + #endregion + + #region Edge Cases + + [Test] + public void EmptySlice() + { + // NumPy: arr[2:2] = [] (empty) + var arr = np.array(new[] { 1, 2, 3, 4, 5 }); + + var result = arr["2:2"]; + + Assert.AreEqual(0, result.size); + } + + [Test] + public void StepGreaterThanSize() + { + // NumPy: arr[::10] = [1] (only first element) + var arr = np.array(new[] { 1, 2, 3, 4, 5 }); + + var result = arr["::10"]; + + Assert.AreEqual(1, result.size); + Assert.AreEqual(1, result.GetInt32(0)); + } + + [Test] + public void ReverseWithStep() + { + // NumPy: arr[4:0:-2] = [5, 3] + var arr = np.array(new[] { 1, 2, 3, 4, 5 }); + + var result = arr["4:0:-2"]; + + result.Should().BeOfValues(5, 3); + } + + #endregion +} diff --git a/test/NumSharp.UnitTest/Backends/Kernels/LinearAlgebraTests.cs b/test/NumSharp.UnitTest/Backends/Kernels/LinearAlgebraTests.cs new file mode 100644 index 00000000..524fa839 --- /dev/null +++ b/test/NumSharp.UnitTest/Backends/Kernels/LinearAlgebraTests.cs @@ -0,0 +1,378 @@ +using System; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using NumSharp; +using NumSharp.UnitTest.Utilities; +using TUnit.Core; + +namespace NumSharp.UnitTest.Backends.Kernels; + +/// +/// Tests for linear algebra operations. +/// All expected values are verified against NumPy 2.x output. +/// +public class LinearAlgebraTests +{ + #region Dot Product + + [Test] + public void Dot_1D_1D() + { + // NumPy: np.dot([1,2,3], [4,5,6]) = 32 + var a = np.array(new[] { 1.0, 2.0, 3.0 }); + var b = np.array(new[] { 4.0, 5.0, 6.0 }); + + var result = np.dot(a, b); + + Assert.AreEqual(32.0, (double)result, 1e-10); + } + + [Test] + public void Dot_2D_1D() + { + // NumPy: np.dot([[1,2],[3,4],[5,6]], [1,2]) = [5, 11, 17] + var A = np.array(new[,] { { 1.0, 2.0 }, { 3.0, 4.0 }, { 5.0, 6.0 } }); + var x = np.array(new[] { 1.0, 2.0 }); + + var result = np.dot(A, x); + + Assert.AreEqual(1, result.ndim); + Assert.AreEqual(3, result.size); + Assert.AreEqual(5.0, result.GetDouble(0), 1e-10); + Assert.AreEqual(11.0, result.GetDouble(1), 1e-10); + Assert.AreEqual(17.0, result.GetDouble(2), 1e-10); + } + + [Test] + [OpenBugs] // 1D @ 2D dot product fails + public void Dot_1D_2D() + { + // NumPy: np.dot([1,2,3], [[1,2],[3,4],[5,6]]) = [22, 28] + var y = np.array(new[] { 1.0, 2.0, 3.0 }); + var A = np.array(new[,] { { 1.0, 2.0 }, { 3.0, 4.0 }, { 5.0, 6.0 } }); + + var result = np.dot(y, A); + + Assert.AreEqual(1, result.ndim); + Assert.AreEqual(2, result.size); + Assert.AreEqual(22.0, result.GetDouble(0), 1e-10); + Assert.AreEqual(28.0, result.GetDouble(1), 1e-10); + } + + [Test] + public void Dot_2D_2D() + { + // NumPy: [[1,2],[3,4],[5,6]] @ [[1,2,3],[4,5,6]] = [[9,12,15],[19,26,33],[29,40,51]] + var A = np.array(new[,] { { 1.0, 2.0 }, { 3.0, 4.0 }, { 5.0, 6.0 } }); + var B = np.array(new[,] { { 1.0, 2.0, 3.0 }, { 4.0, 5.0, 6.0 } }); + + var result = np.dot(A, B); + + Assert.AreEqual(2, result.ndim); + Assert.AreEqual(3, result.shape[0]); + Assert.AreEqual(3, result.shape[1]); + Assert.AreEqual(9.0, result.GetDouble(0, 0), 1e-10); + Assert.AreEqual(26.0, result.GetDouble(1, 1), 1e-10); + Assert.AreEqual(51.0, result.GetDouble(2, 2), 1e-10); + } + + [Test] + public void Dot_Empty() + { + // NumPy: np.dot([], []) = 0.0 + var a = np.array(new double[0]); + var b = np.array(new double[0]); + + var result = np.dot(a, b); + + Assert.AreEqual(0.0, (double)result, 1e-10); + } + + #endregion + + #region Matmul + + [Test] + public void Matmul_2D_2D() + { + // NumPy: A @ B (same as dot for 2D) + var A = np.array(new[,] { { 1.0, 2.0 }, { 3.0, 4.0 } }); + var B = np.array(new[,] { { 5.0, 6.0 }, { 7.0, 8.0 } }); + + var result = np.matmul(A, B); + + Assert.AreEqual(19.0, result.GetDouble(0, 0), 1e-10); + Assert.AreEqual(22.0, result.GetDouble(0, 1), 1e-10); + Assert.AreEqual(43.0, result.GetDouble(1, 0), 1e-10); + Assert.AreEqual(50.0, result.GetDouble(1, 1), 1e-10); + } + + [Test] + [OpenBugs] // 3D matmul broadcasting fails + public void Matmul_3D_2D_Broadcasting() + { + // NumPy: (2, 3, 4) @ (4, 5) = (2, 3, 5) + var batch = np.ones(new[] { 2, 3, 4 }); + var mat = np.ones(new[] { 4, 5 }) * 2; + + var result = np.matmul(batch, mat); + + Assert.AreEqual(3, result.ndim); + Assert.AreEqual(2, result.shape[0]); + Assert.AreEqual(3, result.shape[1]); + Assert.AreEqual(5, result.shape[2]); + Assert.AreEqual(8.0, result.GetDouble(0, 0, 0), 1e-10); // 4 * 2 = 8 + } + + #endregion + + #region Outer Product + + [Test] + public void Outer_Simple() + { + // NumPy: np.outer([1,2,3], [10,20]) = [[10,20],[20,40],[30,60]] + var a = np.array(new[] { 1.0, 2.0, 3.0 }); + var b = np.array(new[] { 10.0, 20.0 }); + + var result = np.outer(a, b); + + Assert.AreEqual(2, result.ndim); + Assert.AreEqual(3, result.shape[0]); + Assert.AreEqual(2, result.shape[1]); + Assert.AreEqual(10.0, result.GetDouble(0, 0), 1e-10); + Assert.AreEqual(40.0, result.GetDouble(1, 1), 1e-10); + Assert.AreEqual(60.0, result.GetDouble(2, 1), 1e-10); + } + + #endregion + + #region Identity and Eye + + [Test] + public void Eye_Square() + { + // NumPy: np.eye(3) = [[1,0,0],[0,1,0],[0,0,1]] + var result = np.eye(3); + + Assert.AreEqual(3, result.shape[0]); + Assert.AreEqual(3, result.shape[1]); + Assert.AreEqual(1.0, result.GetDouble(0, 0), 1e-10); + Assert.AreEqual(0.0, result.GetDouble(0, 1), 1e-10); + Assert.AreEqual(1.0, result.GetDouble(1, 1), 1e-10); + Assert.AreEqual(1.0, result.GetDouble(2, 2), 1e-10); + } + + [Test] + public void Eye_Rectangular() + { + // NumPy: np.eye(3, 4) + var result = np.eye(3, 4); + + Assert.AreEqual(3, result.shape[0]); + Assert.AreEqual(4, result.shape[1]); + Assert.AreEqual(1.0, result.GetDouble(0, 0), 1e-10); + Assert.AreEqual(0.0, result.GetDouble(0, 3), 1e-10); + } + + #endregion + + #region Statistics-Based Linear Algebra + + [Test] + public void Mean_2D_Axis0() + { + // NumPy: np.mean([[1,2,3],[4,5,6]], axis=0) = [2.5, 3.5, 4.5] + var arr = np.array(new[,] { { 1.0, 2.0, 3.0 }, { 4.0, 5.0, 6.0 } }); + + var result = np.mean(arr, axis: 0); + + Assert.AreEqual(1, result.ndim); + Assert.AreEqual(3, result.size); + Assert.AreEqual(2.5, result.GetDouble(0), 1e-10); + Assert.AreEqual(3.5, result.GetDouble(1), 1e-10); + Assert.AreEqual(4.5, result.GetDouble(2), 1e-10); + } + + [Test] + public void Mean_2D_Axis1() + { + // NumPy: np.mean([[1,2,3],[4,5,6]], axis=1) = [2.0, 5.0] + var arr = np.array(new[,] { { 1.0, 2.0, 3.0 }, { 4.0, 5.0, 6.0 } }); + + var result = np.mean(arr, axis: 1); + + Assert.AreEqual(1, result.ndim); + Assert.AreEqual(2, result.size); + Assert.AreEqual(2.0, result.GetDouble(0), 1e-10); + Assert.AreEqual(5.0, result.GetDouble(1), 1e-10); + } + + [Test] + public void Std_Sample() + { + // NumPy: np.std([1, 2, 3, 4, 5]) = 1.4142... (population std) + var arr = np.array(new[] { 1.0, 2.0, 3.0, 4.0, 5.0 }); + + var result = np.std(arr); + + Assert.AreEqual(Math.Sqrt(2.0), result.GetDouble(0), 1e-10); + } + + [Test] + [OpenBugs] // std with ddof parameter fails + public void Std_WithDdof() + { + // NumPy: np.std([1, 2, 3, 4, 5], ddof=1) = 1.5811... (sample std) + var arr = np.array(new[] { 1.0, 2.0, 3.0, 4.0, 5.0 }); + + var result = np.std(arr, ddof: 1); + + // Sample std = sqrt(sum((x-mean)^2) / (n-1)) + Assert.AreEqual(Math.Sqrt(2.5), result.GetDouble(0), 1e-10); + } + + #endregion + + #region Argmax/Argmin with Axis + + [Test] + public void Argmax_NoAxis() + { + // NumPy: np.argmax([[1,5,3],[4,2,6]]) = 5 (flattened index) + var arr = np.array(new[,] { { 1, 5, 3 }, { 4, 2, 6 } }); + + var result = np.argmax(arr); + + Assert.AreEqual(5, result); + } + + [Test] + public void Argmax_Axis0() + { + // NumPy: np.argmax([[1,5,3],[4,2,6]], axis=0) = [1, 0, 1] + var arr = np.array(new[,] { { 1, 5, 3 }, { 4, 2, 6 } }); + + var result = np.argmax(arr, axis: 0); + + result.Should().BeOfValues(1, 0, 1); + } + + [Test] + public void Argmax_Axis1() + { + // NumPy: np.argmax([[1,5,3],[4,2,6]], axis=1) = [1, 2] + var arr = np.array(new[,] { { 1, 5, 3 }, { 4, 2, 6 } }); + + var result = np.argmax(arr, axis: 1); + + result.Should().BeOfValues(1, 2); + } + + [Test] + public void Argmin_NoAxis() + { + // NumPy: np.argmin([[1,5,3],[4,2,6]]) = 0 + var arr = np.array(new[,] { { 1, 5, 3 }, { 4, 2, 6 } }); + + var result = np.argmin(arr); + + Assert.AreEqual(0, result); + } + + [Test] + public void Argmin_Axis0() + { + // NumPy: np.argmin([[1,5,3],[4,2,6]], axis=0) = [0, 1, 0] + var arr = np.array(new[,] { { 1, 5, 3 }, { 4, 2, 6 } }); + + var result = np.argmin(arr, axis: 0); + + result.Should().BeOfValues(0, 1, 0); + } + + #endregion + + #region Cumsum with Axis + + [Test] + public void Cumsum_NoAxis_Flattens() + { + // NumPy: np.cumsum([[1,2,3],[4,5,6]]) = [1,3,6,10,15,21] + var arr = np.array(new[,] { { 1, 2, 3 }, { 4, 5, 6 } }); + + var result = np.cumsum(arr); + + Assert.AreEqual(1, result.ndim); + result.Should().BeOfValues(1, 3, 6, 10, 15, 21); + } + + [Test] + public void Cumsum_Axis0() + { + // NumPy: np.cumsum([[1,2,3],[4,5,6]], axis=0) = [[1,2,3],[5,7,9]] + var arr = np.array(new[,] { { 1, 2, 3 }, { 4, 5, 6 } }); + + var result = np.cumsum(arr, axis: 0); + + Assert.AreEqual(2, result.ndim); + Assert.AreEqual(1, result.GetInt32(0, 0)); + Assert.AreEqual(5, result.GetInt32(1, 0)); + Assert.AreEqual(9, result.GetInt32(1, 2)); + } + + [Test] + public void Cumsum_Axis1() + { + // NumPy: np.cumsum([[1,2,3],[4,5,6]], axis=1) = [[1,3,6],[4,9,15]] + var arr = np.array(new[,] { { 1, 2, 3 }, { 4, 5, 6 } }); + + var result = np.cumsum(arr, axis: 1); + + Assert.AreEqual(2, result.ndim); + Assert.AreEqual(1, result.GetInt32(0, 0)); + Assert.AreEqual(6, result.GetInt32(0, 2)); + Assert.AreEqual(15, result.GetInt32(1, 2)); + } + + #endregion + + #region Searchsorted + + [Test] + [OpenBugs] // searchsorted returns NDArray not int + public void Searchsorted_Simple() + { + // NumPy: np.searchsorted([1,2,3,4,5], 3) = 2 + var arr = np.array(new[] { 1, 2, 3, 4, 5 }); + + var result = np.searchsorted(arr, 3); + + Assert.AreEqual(2, result); + } + + [Test] + [OpenBugs] // searchsorted returns NDArray not int + public void Searchsorted_BeforeAll() + { + // NumPy: np.searchsorted([1,2,3,4,5], 0) = 0 + var arr = np.array(new[] { 1, 2, 3, 4, 5 }); + + var result = np.searchsorted(arr, 0); + + Assert.AreEqual(0, result); + } + + [Test] + [OpenBugs] // searchsorted returns NDArray not int + public void Searchsorted_AfterAll() + { + // NumPy: np.searchsorted([1,2,3,4,5], 10) = 5 + var arr = np.array(new[] { 1, 2, 3, 4, 5 }); + + var result = np.searchsorted(arr, 10); + + Assert.AreEqual(5, result); + } + + #endregion +} diff --git a/test/NumSharp.UnitTest/Backends/Kernels/ManipulationEdgeCaseTests.cs b/test/NumSharp.UnitTest/Backends/Kernels/ManipulationEdgeCaseTests.cs new file mode 100644 index 00000000..f9204d1d --- /dev/null +++ b/test/NumSharp.UnitTest/Backends/Kernels/ManipulationEdgeCaseTests.cs @@ -0,0 +1,449 @@ +using System; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using NumSharp; +using NumSharp.UnitTest.Utilities; +using TUnit.Core; + +namespace NumSharp.UnitTest.Backends.Kernels; + +/// +/// Edge case tests for array manipulation operations. +/// All expected values are verified against NumPy 2.x output. +/// +public class ManipulationEdgeCaseTests +{ + #region Broadcasting Complex Scenarios + + [Test] + public void Broadcast_3D_With_2D() + { + // NumPy: (2,3,4) + (3,4) = (2,3,4) + var a = np.ones(new[] { 2, 3, 4 }); + var b = np.ones(new[] { 3, 4 }) * 2; + + var result = a + b; + + Assert.AreEqual(3, result.ndim); + Assert.AreEqual(2, result.shape[0]); + Assert.AreEqual(3, result.shape[1]); + Assert.AreEqual(4, result.shape[2]); + Assert.AreEqual(3.0, result.GetDouble(0, 0, 0)); + } + + [Test] + public void Broadcast_3D_With_1D() + { + // NumPy: (2,3,4) + (4,) = (2,3,4) + var a = np.ones(new[] { 2, 3, 4 }); + var b = np.array(new[] { 1.0, 2.0, 3.0, 4.0 }); + + var result = a + b; + + Assert.AreEqual(3, result.ndim); + Assert.AreEqual(2, result.shape[0]); + Assert.AreEqual(3, result.shape[1]); + Assert.AreEqual(4, result.shape[2]); + } + + [Test] + public void Broadcast_Row_Plus_Column() + { + // NumPy: (1,3) + (3,1) = (3,3) + var row = np.array(new double[,] { { 1, 2, 3 } }); // (1, 3) + var col = np.array(new double[,] { { 10 }, { 20 }, { 30 } }); // (3, 1) + + var result = row + col; + + Assert.AreEqual(2, result.ndim); + Assert.AreEqual(3, result.shape[0]); + Assert.AreEqual(3, result.shape[1]); + Assert.AreEqual(11.0, result.GetDouble(0, 0)); + Assert.AreEqual(23.0, result.GetDouble(1, 2)); + Assert.AreEqual(33.0, result.GetDouble(2, 2)); + } + + [Test] + public void Broadcast_EmptyArray_WithShape() + { + // NumPy: np.zeros((0,3)) + np.array([1,2,3]) = shape (0, 3) + var a = np.zeros(new[] { 0, 3 }); + var b = np.array(new[] { 1.0, 2.0, 3.0 }); + + var result = a + b; + + Assert.AreEqual(2, result.ndim); + Assert.AreEqual(0, result.shape[0]); + Assert.AreEqual(3, result.shape[1]); + Assert.AreEqual(0, result.size); + } + + #endregion + + #region Squeeze Edge Cases + + [Test] + public void Squeeze_RemovesAllOnes() + { + // NumPy: np.squeeze([[[[1, 2, 3]]]]) = [1, 2, 3] with shape (3,) + var arr = np.array(new double[,,,] { { { { 1, 2, 3 } } } }); // (1, 1, 1, 3) + + var result = np.squeeze(arr); + + Assert.AreEqual(1, result.ndim); + Assert.AreEqual(3, result.shape[0]); + } + + [Test] + public void Squeeze_SpecificAxis() + { + // NumPy: np.squeeze(arr, axis=0) where arr.shape = (1, 1, 3) + var arr = np.ones(new[] { 1, 1, 3 }); + + var result = np.squeeze(arr, 0); + + Assert.AreEqual(2, result.ndim); + Assert.AreEqual(1, result.shape[0]); + Assert.AreEqual(3, result.shape[1]); + } + + #endregion + + #region Expand Dims Edge Cases + + [Test] + public void ExpandDims_NegativeAxis() + { + // NumPy: np.expand_dims([1,2,3], -1).shape = (3, 1) + var arr = np.array(new[] { 1, 2, 3 }); + + var result = np.expand_dims(arr, -1); + + Assert.AreEqual(2, result.ndim); + Assert.AreEqual(3, result.shape[0]); + Assert.AreEqual(1, result.shape[1]); + } + + [Test] + public void ExpandDims_Multiple() + { + // NumPy: np.expand_dims(np.expand_dims(arr, 0), 0).shape = (1, 1, 3) + var arr = np.array(new[] { 1, 2, 3 }); + + var result = np.expand_dims(np.expand_dims(arr, 0), 0); + + Assert.AreEqual(3, result.ndim); + Assert.AreEqual(1, result.shape[0]); + Assert.AreEqual(1, result.shape[1]); + Assert.AreEqual(3, result.shape[2]); + } + + #endregion + + #region Concatenate Edge Cases + + [Test] + public void Concatenate_1D() + { + // NumPy: np.concatenate([[1,2,3], [4,5,6]]) = [1,2,3,4,5,6] + var a = np.array(new[] { 1, 2, 3 }); + var b = np.array(new[] { 4, 5, 6 }); + + var result = np.concatenate(new[] { a, b }); + + result.Should().BeOfValues(1, 2, 3, 4, 5, 6); + } + + [Test] + public void Concatenate_2D_Axis0() + { + // NumPy: np.concatenate([[[1,2],[3,4]], [[5,6],[7,8]]], axis=0) + var a = np.array(new[,] { { 1, 2 }, { 3, 4 } }); + var b = np.array(new[,] { { 5, 6 }, { 7, 8 } }); + + var result = np.concatenate(new[] { a, b }, axis: 0); + + Assert.AreEqual(4, result.shape[0]); + Assert.AreEqual(2, result.shape[1]); + Assert.AreEqual(5, result.GetInt32(2, 0)); + } + + [Test] + public void Concatenate_2D_Axis1() + { + var a = np.array(new[,] { { 1, 2 }, { 3, 4 } }); + var b = np.array(new[,] { { 5, 6 }, { 7, 8 } }); + + var result = np.concatenate(new[] { a, b }, axis: 1); + + Assert.AreEqual(2, result.shape[0]); + Assert.AreEqual(4, result.shape[1]); + Assert.AreEqual(5, result.GetInt32(0, 2)); + } + + [Test] + public void Concatenate_EmptyWithNonEmpty() + { + // NumPy: np.concatenate([[], [1,2]]) = [1., 2.] + var empty = np.array(new double[0]); + var b = np.array(new[] { 1.0, 2.0 }); + + var result = np.concatenate(new[] { empty, b }); + + Assert.AreEqual(2, result.size); + } + + #endregion + + #region Stack Edge Cases + + [Test] + public void Stack_DefaultAxis0() + { + // NumPy: np.stack([[1,2,3], [4,5,6]]) = [[1,2,3], [4,5,6]] + var a = np.array(new[] { 1, 2, 3 }); + var b = np.array(new[] { 4, 5, 6 }); + + var result = np.stack(new[] { a, b }); + + Assert.AreEqual(2, result.shape[0]); + Assert.AreEqual(3, result.shape[1]); + } + + [Test] + public void Stack_Axis1() + { + // NumPy: np.stack([[1,2,3], [4,5,6]], axis=1) = [[1,4], [2,5], [3,6]] + var a = np.array(new[] { 1, 2, 3 }); + var b = np.array(new[] { 4, 5, 6 }); + + var result = np.stack(new[] { a, b }, axis: 1); + + Assert.AreEqual(3, result.shape[0]); + Assert.AreEqual(2, result.shape[1]); + Assert.AreEqual(1, result.GetInt32(0, 0)); + Assert.AreEqual(4, result.GetInt32(0, 1)); + } + + #endregion + + #region VStack/HStack Edge Cases + + [Test] + public void VStack_1D() + { + // NumPy: np.vstack([[1,2,3], [4,5,6]]) = [[1,2,3], [4,5,6]] + var a = np.array(new[] { 1, 2, 3 }); + var b = np.array(new[] { 4, 5, 6 }); + + var result = np.vstack(a, b); + + Assert.AreEqual(2, result.shape[0]); + Assert.AreEqual(3, result.shape[1]); + } + + [Test] + public void HStack_1D() + { + // NumPy: np.hstack([[1,2,3], [4,5,6]]) = [1,2,3,4,5,6] + var a = np.array(new[] { 1, 2, 3 }); + var b = np.array(new[] { 4, 5, 6 }); + + var result = np.hstack(a, b); + + Assert.AreEqual(1, result.ndim); + Assert.AreEqual(6, result.size); + } + + [Test] + public void HStack_2D() + { + var a = np.array(new[,] { { 1, 2 }, { 3, 4 } }); + var b = np.array(new[,] { { 5, 6 }, { 7, 8 } }); + + var result = np.hstack(a, b); + + Assert.AreEqual(2, result.shape[0]); + Assert.AreEqual(4, result.shape[1]); + } + + #endregion + + #region Repeat Edge Cases + + [Test] + public void Repeat_Scalar() + { + // NumPy: np.repeat([1, 2, 3], 3) = [1, 1, 1, 2, 2, 2, 3, 3, 3] + var arr = np.array(new[] { 1, 2, 3 }); + + var result = np.repeat(arr, 3); + + result.Should().BeOfValues(1, 1, 1, 2, 2, 2, 3, 3, 3); + } + + [Test] + [OpenBugs] // Repeat with per-element counts fails + public void Repeat_PerElement() + { + // NumPy: np.repeat([1, 2, 3], [1, 2, 3]) = [1, 2, 2, 3, 3, 3] + var arr = np.array(new[] { 1, 2, 3 }); + var repeats = np.array(new[] { 1, 2, 3 }); + + var result = np.repeat(arr, repeats); + + result.Should().BeOfValues(1, 2, 2, 3, 3, 3); + } + + #endregion + + #region Flatten/Ravel Edge Cases + + [Test] + public void Flatten_ReturnsContiguousCopy() + { + var arr = np.array(new[,] { { 1, 2 }, { 3, 4 } }); + + var flat = arr.flatten(); + + flat.Should().BeOfValues(1, 2, 3, 4); + Assert.AreEqual(1, flat.ndim); + } + + [Test] + public void Ravel_Returns1D() + { + var arr = np.array(new[,] { { 1, 2 }, { 3, 4 } }); + + var raveled = arr.ravel(); + + raveled.Should().BeOfValues(1, 2, 3, 4); + Assert.AreEqual(1, raveled.ndim); + } + + [Test] + public void Ravel_SlicedArray() + { + var arr = np.array(new[] { 1, 2, 3, 4, 5, 6 }); + var sliced = arr["::2"]; // [1, 3, 5] + + var raveled = sliced.ravel(); + + raveled.Should().BeOfValues(1, 3, 5); + } + + #endregion + + #region Reshape Edge Cases + + [Test] + public void Reshape_InferDimension() + { + // NumPy: np.reshape([1,2,3,4,5,6], (-1, 2)) = [[1,2],[3,4],[5,6]] + var arr = np.array(new[] { 1, 2, 3, 4, 5, 6 }); + + var result = arr.reshape(-1, 2); + + Assert.AreEqual(3, result.shape[0]); + Assert.AreEqual(2, result.shape[1]); + } + + [Test] + public void Reshape_ToScalar() + { + // NumPy: np.array([5]).reshape(()) = 5 (0D scalar) + var arr = np.array(new[] { 5 }); + + var result = arr.reshape(); // Empty shape = scalar + + Assert.AreEqual(0, result.ndim); + Assert.AreEqual(1, result.size); + } + + [Test] + public void Reshape_EmptyArray() + { + // NumPy: np.array([]).reshape((0, 5)).shape = (0, 5) + var arr = np.array(new double[0]); + + var result = arr.reshape(0, 5); + + Assert.AreEqual(0, result.shape[0]); + Assert.AreEqual(5, result.shape[1]); + Assert.AreEqual(0, result.size); + } + + #endregion + + #region Transpose Edge Cases + + [Test] + public void Transpose_1D_NoOp() + { + // NumPy: arr1d.T.shape = (3,) (no change for 1D) + var arr = np.array(new[] { 1, 2, 3 }); + + var transposed = arr.T; + + Assert.AreEqual(1, transposed.ndim); + Assert.AreEqual(3, transposed.shape[0]); + } + + [Test] + public void Transpose_2D() + { + var arr = np.array(new[,] { { 1, 2, 3 }, { 4, 5, 6 } }); + + var transposed = arr.T; + + Assert.AreEqual(3, transposed.shape[0]); + Assert.AreEqual(2, transposed.shape[1]); + Assert.AreEqual(1, transposed.GetInt32(0, 0)); + Assert.AreEqual(4, transposed.GetInt32(0, 1)); + } + + [Test] + public void Transpose_3D() + { + // NumPy: arr3d.T reverses all axes + var arr = np.arange(24).reshape(2, 3, 4); + + var transposed = arr.T; + + Assert.AreEqual(4, transposed.shape[0]); + Assert.AreEqual(3, transposed.shape[1]); + Assert.AreEqual(2, transposed.shape[2]); + } + + #endregion + + #region Unique Edge Cases + + [Test] + [OpenBugs] // Bug: np.unique doesn't return sorted array + public void Unique_ReturnsSorted() + { + // NumPy: np.unique([3, 1, 2, 1, 3, 2]) = [1, 2, 3] (sorted!) + var arr = np.array(new[] { 3, 1, 2, 1, 3, 2 }); + + var result = np.unique(arr); + + result.Should().BeOfValues(1, 2, 3); + } + + [Test] + [OpenBugs] // Bug: np.unique with NaN values fails + public void Unique_Float_WithNaN() + { + // NumPy: np.unique([1, nan, 2, nan, 1]) = [1, 2, nan] + var arr = np.array(new[] { 1.0, double.NaN, 2.0, double.NaN, 1.0 }); + + var result = np.unique(arr); + + Assert.AreEqual(3, result.size); + Assert.AreEqual(1.0, result.GetDouble(0)); + Assert.AreEqual(2.0, result.GetDouble(1)); + Assert.IsTrue(double.IsNaN(result.GetDouble(2))); + } + + #endregion +} diff --git a/test/NumSharp.UnitTest/Backends/Kernels/ReductionOpTests.cs b/test/NumSharp.UnitTest/Backends/Kernels/ReductionOpTests.cs new file mode 100644 index 00000000..54a89025 --- /dev/null +++ b/test/NumSharp.UnitTest/Backends/Kernels/ReductionOpTests.cs @@ -0,0 +1,554 @@ +using System; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using NumSharp; +using NumSharp.UnitTest.Utilities; +using TUnit.Core; + +namespace NumSharp.UnitTest.Backends.Kernels; + +/// +/// Comprehensive tests for reduction operations (Sum, Prod, Max, Min, ArgMax, ArgMin, Mean, Std, Var, CumSum). +/// All expected values are verified against NumPy 2.x output. +/// These tests validate existing reduction functionality and serve as +/// regression tests for future IL kernel Phase 5 implementation. +/// +public class ReductionOpTests +{ + private const double Tolerance = 1e-10; + + #region Basic 1D Sum Tests + + [Test] + public void Sum_Float64_1D() + { + // NumPy: sum([1.0, 2.0, 3.0, 4.0, 5.0]) = 15.0 + var a = np.array(new double[] { 1.0, 2.0, 3.0, 4.0, 5.0 }); + var result = np.sum(a); + + Assert.AreEqual(15.0, result.GetDouble(0)); + } + + [Test] + [OpenBugs] // Sum may have memory corruption issues + public void Sum_Int32_1D() + { + var a = np.array(new[] { 1, 2, 3, 4, 5 }); + var result = np.sum(a); + + Assert.AreEqual(15L, result.GetInt64(0)); + } + + #endregion + + #region Basic 1D Prod Tests + + [Test] + public void Prod_Float64_1D() + { + // NumPy: prod([1.0, 2.0, 3.0, 4.0, 5.0]) = 120.0 + var a = np.array(new double[] { 1.0, 2.0, 3.0, 4.0, 5.0 }); + var result = np.prod(a); + + Assert.AreEqual(120.0, result.GetDouble(0)); + } + + #endregion + + #region Basic 1D Max/Min Tests + + [Test] + public void Max_Float64_1D() + { + // NumPy: max([1.0, 2.0, 3.0, 4.0, 5.0]) = 5.0 + var a = np.array(new double[] { 1.0, 2.0, 3.0, 4.0, 5.0 }); + var result = np.amax(a); + + Assert.AreEqual(5.0, result.GetDouble(0)); + } + + [Test] + public void Min_Float64_1D() + { + // NumPy: min([1.0, 2.0, 3.0, 4.0, 5.0]) = 1.0 + var a = np.array(new double[] { 1.0, 2.0, 3.0, 4.0, 5.0 }); + var result = np.amin(a); + + Assert.AreEqual(1.0, result.GetDouble(0)); + } + + #endregion + + #region Basic 1D ArgMax/ArgMin Tests + + [Test] + public void ArgMax_Float64_1D() + { + // NumPy: argmax([1.0, 2.0, 3.0, 4.0, 5.0]) = 4 + var a = np.array(new double[] { 1.0, 2.0, 3.0, 4.0, 5.0 }); + var result = np.argmax(a); + + Assert.AreEqual(4, result); + } + + [Test] + public void ArgMin_Float64_1D() + { + // NumPy: argmin([1.0, 2.0, 3.0, 4.0, 5.0]) = 0 + var a = np.array(new double[] { 1.0, 2.0, 3.0, 4.0, 5.0 }); + var result = np.argmin(a); + + Assert.AreEqual(0, result); + } + + #endregion + + #region Basic 1D Mean/Std/Var Tests + + [Test] + public void Mean_Float64_1D() + { + // NumPy: mean([1.0, 2.0, 3.0, 4.0, 5.0]) = 3.0 + var a = np.array(new double[] { 1.0, 2.0, 3.0, 4.0, 5.0 }); + var result = np.mean(a); + + Assert.AreEqual(3.0, result.GetDouble(0)); + } + + [Test] + public void Std_Float64_1D() + { + // NumPy: std([1.0, 2.0, 3.0, 4.0, 5.0]) = 1.4142135623730951 + var a = np.array(new double[] { 1.0, 2.0, 3.0, 4.0, 5.0 }); + var result = np.std(a); + + Assert.IsTrue(Math.Abs(result.GetDouble(0) - 1.4142135623730951) < Tolerance); + } + + [Test] + public void Var_Float64_1D() + { + // NumPy: var([1.0, 2.0, 3.0, 4.0, 5.0]) = 2.0 + var a = np.array(new double[] { 1.0, 2.0, 3.0, 4.0, 5.0 }); + var result = np.var(a); + + Assert.IsTrue(Math.Abs(result.GetDouble(0) - 2.0) < Tolerance); + } + + #endregion + + #region Basic 1D CumSum Tests + + [Test] + public void CumSum_Float64_1D() + { + // NumPy: cumsum([1.0, 2.0, 3.0, 4.0, 5.0]) = [1.0, 3.0, 6.0, 10.0, 15.0] + var a = np.array(new double[] { 1.0, 2.0, 3.0, 4.0, 5.0 }); + var result = np.cumsum(a); + + result.Should().BeOfValues(1.0, 3.0, 6.0, 10.0, 15.0); + } + + #endregion + + #region 2D Sum with Axis Tests + + [Test] + public void Sum_2D_NoAxis() + { + // NumPy: sum([[1,2,3],[4,5,6]]) = 21.0 + var a = np.array(new[,] { { 1.0, 2.0, 3.0 }, { 4.0, 5.0, 6.0 } }); + var result = np.sum(a); + + Assert.AreEqual(21.0, result.GetDouble(0)); + } + + [Test] + public void Sum_2D_Axis0() + { + // NumPy: sum([[1,2,3],[4,5,6]], axis=0) = [5, 7, 9] + var a = np.array(new[,] { { 1.0, 2.0, 3.0 }, { 4.0, 5.0, 6.0 } }); + var result = np.sum(a, axis: 0); + + result.Should().BeShaped(3); + result.Should().BeOfValues(5.0, 7.0, 9.0); + } + + [Test] + public void Sum_2D_Axis1() + { + // NumPy: sum([[1,2,3],[4,5,6]], axis=1) = [6, 15] + var a = np.array(new[,] { { 1.0, 2.0, 3.0 }, { 4.0, 5.0, 6.0 } }); + var result = np.sum(a, axis: 1); + + result.Should().BeShaped(2); + result.Should().BeOfValues(6.0, 15.0); + } + + #endregion + + #region 2D Mean with Axis Tests + + [Test] + public void Mean_2D_Axis0() + { + // NumPy: mean([[1,2,3],[4,5,6]], axis=0) = [2.5, 3.5, 4.5] + var a = np.array(new[,] { { 1.0, 2.0, 3.0 }, { 4.0, 5.0, 6.0 } }); + var result = np.mean(a, axis: 0); + + result.Should().BeShaped(3); + result.Should().BeOfValues(2.5, 3.5, 4.5); + } + + [Test] + public void Mean_2D_Axis1() + { + // NumPy: mean([[1,2,3],[4,5,6]], axis=1) = [2.0, 5.0] + var a = np.array(new[,] { { 1.0, 2.0, 3.0 }, { 4.0, 5.0, 6.0 } }); + var result = np.mean(a, axis: 1); + + result.Should().BeShaped(2); + result.Should().BeOfValues(2.0, 5.0); + } + + #endregion + + #region 2D Max/Min with Axis Tests + + [Test] + public void Max_2D_Axis0() + { + // NumPy: max([[1,2,3],[4,5,6]], axis=0) = [4, 5, 6] + var a = np.array(new[,] { { 1.0, 2.0, 3.0 }, { 4.0, 5.0, 6.0 } }); + var result = np.amax(a, axis: 0); + + result.Should().BeShaped(3); + result.Should().BeOfValues(4.0, 5.0, 6.0); + } + + [Test] + public void Max_2D_Axis1() + { + // NumPy: max([[1,2,3],[4,5,6]], axis=1) = [3, 6] + var a = np.array(new[,] { { 1.0, 2.0, 3.0 }, { 4.0, 5.0, 6.0 } }); + var result = np.amax(a, axis: 1); + + result.Should().BeShaped(2); + result.Should().BeOfValues(3.0, 6.0); + } + + [Test] + public void Min_2D_Axis0() + { + // NumPy: min([[1,2,3],[4,5,6]], axis=0) = [1, 2, 3] + var a = np.array(new[,] { { 1.0, 2.0, 3.0 }, { 4.0, 5.0, 6.0 } }); + var result = np.amin(a, axis: 0); + + result.Should().BeShaped(3); + result.Should().BeOfValues(1.0, 2.0, 3.0); + } + + [Test] + public void Min_2D_Axis1() + { + // NumPy: min([[1,2,3],[4,5,6]], axis=1) = [1, 4] + var a = np.array(new[,] { { 1.0, 2.0, 3.0 }, { 4.0, 5.0, 6.0 } }); + var result = np.amin(a, axis: 1); + + result.Should().BeShaped(2); + result.Should().BeOfValues(1.0, 4.0); + } + + #endregion + + #region 2D ArgMax/ArgMin with Axis Tests + + [Test] + public void ArgMax_2D_Axis0() + { + // NumPy: argmax([[1,2,3],[4,5,6]], axis=0) = [1, 1, 1] + var a = np.array(new[,] { { 1.0, 2.0, 3.0 }, { 4.0, 5.0, 6.0 } }); + var result = np.argmax(a, axis: 0); + + result.Should().BeShaped(3); + result.Should().BeOfValues(1L, 1L, 1L); + } + + [Test] + public void ArgMax_2D_Axis1() + { + // NumPy: argmax([[1,2,3],[4,5,6]], axis=1) = [2, 2] + var a = np.array(new[,] { { 1.0, 2.0, 3.0 }, { 4.0, 5.0, 6.0 } }); + var result = np.argmax(a, axis: 1); + + result.Should().BeShaped(2); + result.Should().BeOfValues(2L, 2L); + } + + #endregion + + #region keepdims Tests + + [Test] + public void Sum_2D_Axis0_Keepdims() + { + // NumPy: sum([[1,2,3],[4,5,6]], axis=0, keepdims=True) = [[5, 7, 9]], shape=(1,3) + var a = np.array(new[,] { { 1.0, 2.0, 3.0 }, { 4.0, 5.0, 6.0 } }); + var result = np.sum(a, axis: 0, keepdims: true); + + result.Should().BeShaped(1, 3); + result.Should().BeOfValues(5.0, 7.0, 9.0); + } + + [Test] + public void Sum_2D_Axis1_Keepdims() + { + // NumPy: sum([[1,2,3],[4,5,6]], axis=1, keepdims=True) = [[6], [15]], shape=(2,1) + var a = np.array(new[,] { { 1.0, 2.0, 3.0 }, { 4.0, 5.0, 6.0 } }); + var result = np.sum(a, axis: 1, keepdims: true); + + result.Should().BeShaped(2, 1); + result.Should().BeOfValues(6.0, 15.0); + } + + [Test] + public void Mean_2D_Axis0_Keepdims() + { + var a = np.array(new[,] { { 1.0, 2.0, 3.0 }, { 4.0, 5.0, 6.0 } }); + var result = np.mean(a, axis: 0, keepdims: true); + + result.Should().BeShaped(1, 3); + result.Should().BeOfValues(2.5, 3.5, 4.5); + } + + #endregion + + #region Edge Cases - Infinity + + [Test] + public void Sum_WithInfinity() + { + // NumPy: sum([1.0, inf, 3.0]) = inf + var a = np.array(new double[] { 1.0, double.PositiveInfinity, 3.0 }); + var result = np.sum(a); + + Assert.IsTrue(double.IsPositiveInfinity(result.GetDouble(0))); + } + + [Test] + public void Mean_WithInfinity() + { + // NumPy: mean([1.0, inf, 3.0]) = inf + var a = np.array(new double[] { 1.0, double.PositiveInfinity, 3.0 }); + var result = np.mean(a); + + Assert.IsTrue(double.IsPositiveInfinity(result.GetDouble(0))); + } + + #endregion + + #region Edge Cases - NaN + + [Test] + public void Sum_WithNaN() + { + // NumPy: sum([1.0, nan, 3.0]) = nan + var a = np.array(new double[] { 1.0, double.NaN, 3.0 }); + var result = np.sum(a); + + Assert.IsTrue(double.IsNaN(result.GetDouble(0))); + } + + [Test] + public void Mean_WithNaN() + { + // NumPy: mean([1.0, nan, 3.0]) = nan + var a = np.array(new double[] { 1.0, double.NaN, 3.0 }); + var result = np.mean(a); + + Assert.IsTrue(double.IsNaN(result.GetDouble(0))); + } + + [Test] + public void Max_WithNaN() + { + // NumPy: max([1.0, nan, 3.0]) = nan + var a = np.array(new double[] { 1.0, double.NaN, 3.0 }); + var result = np.amax(a); + + Assert.IsTrue(double.IsNaN(result.GetDouble(0))); + } + + #endregion + + #region Edge Cases - Empty Array + + [Test] + public void Sum_EmptyArray() + { + // NumPy: sum([]) = 0.0 + var a = np.array(Array.Empty()); + var result = np.sum(a); + + Assert.AreEqual(0.0, result.GetDouble(0)); + } + + [Test] + public void Prod_EmptyArray() + { + // NumPy: prod([]) = 1.0 + var a = np.array(Array.Empty()); + var result = np.prod(a); + + Assert.AreEqual(1.0, result.GetDouble(0)); + } + + #endregion + + #region Edge Cases - 0D Scalar + + [Test] + public void Sum_0DScalar() + { + // NumPy: sum(np.array(5.0)) = 5.0, shape=() + var a = np.array(5.0); + var result = np.sum(a); + + Assert.AreEqual(0, result.ndim); + Assert.AreEqual(5.0, result.GetDouble(0)); + } + + #endregion + + #region CumSum with Axis Tests + + [Test] + public void CumSum_2D_NoAxis() + { + // NumPy: cumsum([[1,2,3],[4,5,6]]) = [1, 3, 6, 10, 15, 21] + var a = np.array(new[,] { { 1, 2, 3 }, { 4, 5, 6 } }); + var result = np.cumsum(a); + + result.Should().BeOfValues(1, 3, 6, 10, 15, 21); + } + + [Test] + public void CumSum_2D_Axis0() + { + // NumPy: cumsum([[1,2,3],[4,5,6]], axis=0) = [[1, 2, 3], [5, 7, 9]] + var a = np.array(new[,] { { 1, 2, 3 }, { 4, 5, 6 } }); + var result = np.cumsum(a, axis: 0); + + result.Should().BeShaped(2, 3); + result.Should().BeOfValues(1, 2, 3, 5, 7, 9); + } + + [Test] + public void CumSum_2D_Axis1() + { + // NumPy: cumsum([[1,2,3],[4,5,6]], axis=1) = [[1, 3, 6], [4, 9, 15]] + var a = np.array(new[,] { { 1, 2, 3 }, { 4, 5, 6 } }); + var result = np.cumsum(a, axis: 1); + + result.Should().BeShaped(2, 3); + result.Should().BeOfValues(1, 3, 6, 4, 9, 15); + } + + #endregion + + #region Boolean Reduction Tests + + [Test] + [OpenBugs] // Bool sum may have issues + public void Sum_Bool() + { + // NumPy: sum([True, False, True, True]) = 3 + var a = np.array(new[] { true, false, true, true }); + var result = np.sum(a); + + Assert.AreEqual(3L, result.GetInt64(0)); + } + + [Test] + public void All_Bool() + { + // NumPy: all([True, False, True, True]) = False + var a = np.array(new[] { true, false, true, true }); + var result = np.all(a); + + Assert.IsFalse(result); + } + + [Test] + public void All_Bool_AllTrue() + { + var a = np.array(new[] { true, true, true, true }); + var result = np.all(a); + + Assert.IsTrue(result); + } + + #endregion + + #region Integer Type Tests + + [Test] + [OpenBugs] // Sum may have memory corruption issues + public void Sum_Int32_PromotesToInt64() + { + // NumPy: int32 sum returns int64 + var a = np.array(new[] { 1, 2, 3, 4, 5 }); + var result = np.sum(a); + + Assert.AreEqual(15L, result.GetInt64(0)); + Assert.AreEqual(NPTypeCode.Int64, result.typecode); + } + + [Test] + public void Mean_Int32_ReturnsFloat64() + { + // NumPy: int32 mean returns float64 + var a = np.array(new[] { 1, 2, 3, 4, 5 }); + var result = np.mean(a); + + Assert.AreEqual(3.0, result.GetDouble(0)); + Assert.AreEqual(NPTypeCode.Double, result.typecode); + } + + [Test] + public void Max_Int32_PreservesType() + { + // NumPy: int32 max returns int32 + var a = np.array(new[] { 1, 2, 3, 4, 5 }); + var result = np.amax(a); + + Assert.AreEqual(5, result.GetInt32(0)); + Assert.AreEqual(NPTypeCode.Int32, result.typecode); + } + + #endregion + + #region Sliced Array Tests + + [Test] + [OpenBugs] // Sum may have memory corruption issues + public void Sum_SlicedArray() + { + var a = np.array(new[] { 1, 2, 3, 4, 5, 6 }); + var sliced = a["::2"]; // [1, 3, 5] + var result = np.sum(sliced); + + Assert.AreEqual(9L, result.GetInt64(0)); + } + + [Test] + public void Mean_SlicedArray() + { + var a = np.array(new double[] { 1, 2, 3, 4, 5, 6 }); + var sliced = a["::2"]; // [1, 3, 5] + var result = np.mean(sliced); + + Assert.AreEqual(3.0, result.GetDouble(0)); + } + + #endregion +} diff --git a/test/NumSharp.UnitTest/Backends/Kernels/SlicedArrayOpTests.cs b/test/NumSharp.UnitTest/Backends/Kernels/SlicedArrayOpTests.cs new file mode 100644 index 00000000..08e52c3a --- /dev/null +++ b/test/NumSharp.UnitTest/Backends/Kernels/SlicedArrayOpTests.cs @@ -0,0 +1,642 @@ +using System; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using NumSharp; +using NumSharp.UnitTest.Utilities; +using TUnit.Core; + +namespace NumSharp.UnitTest.Backends.Kernels; + +/// +/// Comprehensive tests for operations on sliced (non-contiguous) arrays. +/// All expected values are verified against NumPy 2.x output. +/// Sliced arrays test the strided path of IL kernels rather than the SIMD contiguous path. +/// +public class SlicedArrayOpTests +{ + #region Binary Operations on Sliced Arrays + + [Test] + public void Add_SlicedArrays_Int32() + { + // NumPy: a[::2] + b[::2] where a=[1,2,3,4,5,6,7,8], b=[10,20,30,40,50,60,70,80] + // a[::2] = [1, 3, 5, 7], b[::2] = [10, 30, 50, 70] + // Result: [11, 33, 55, 77] + var a = np.array(new[] { 1, 2, 3, 4, 5, 6, 7, 8 }); + var b = np.array(new[] { 10, 20, 30, 40, 50, 60, 70, 80 }); + + var result = a["::2"] + b["::2"]; + + result.Should().BeOfValues(11, 33, 55, 77).And.BeOfType(NPTypeCode.Int32); + } + + [Test] + public void Add_SlicedArrays_SameSource() + { + // NumPy: a[::2] + a[1::2] where a=[1,2,3,4,5,6,7,8] + // a[::2] = [1, 3, 5, 7], a[1::2] = [2, 4, 6, 8] + // Result: [3, 7, 11, 15] + var a = np.array(new[] { 1, 2, 3, 4, 5, 6, 7, 8 }); + + var result = a["::2"] + a["1::2"]; + + result.Should().BeOfValues(3, 7, 11, 15).And.BeOfType(NPTypeCode.Int32); + } + + [Test] + public void Subtract_SlicedArrays_Float64() + { + // a[::2] - a[1::2] + var a = np.array(new[] { 10.0, 2.0, 30.0, 4.0, 50.0, 6.0 }); + // a[::2] = [10, 30, 50], a[1::2] = [2, 4, 6] + // Result: [8, 26, 44] + + var result = a["::2"] - a["1::2"]; + + Assert.AreEqual(8.0, result.GetDouble(0), 1e-10); + Assert.AreEqual(26.0, result.GetDouble(1), 1e-10); + Assert.AreEqual(44.0, result.GetDouble(2), 1e-10); + } + + [Test] + public void Multiply_SlicedArrays_Int32() + { + var a = np.array(new[] { 1, 2, 3, 4, 5, 6 }); + // a[::2] = [1, 3, 5], a[1::2] = [2, 4, 6] + // Result: [2, 12, 30] + + var result = a["::2"] * a["1::2"]; + + result.Should().BeOfValues(2, 12, 30).And.BeOfType(NPTypeCode.Int32); + } + + [Test] + public void Divide_SlicedArrays_Float64() + { + var a = np.array(new[] { 10.0, 2.0, 30.0, 5.0, 60.0, 6.0 }); + // a[::2] = [10, 30, 60], a[1::2] = [2, 5, 6] + // Result: [5, 6, 10] + + var result = a["::2"] / a["1::2"]; + + Assert.AreEqual(5.0, result.GetDouble(0), 1e-10); + Assert.AreEqual(6.0, result.GetDouble(1), 1e-10); + Assert.AreEqual(10.0, result.GetDouble(2), 1e-10); + } + + [Test] + [OpenBugs] // Sliced array + scalar fails + public void Add_SlicedWithScalar() + { + // NumPy: j[::2] + 5 where j=[10, 20, 30, 40, 50] + // j[::2] = [10, 30, 50] + // Result: [15, 35, 55] + var j = np.array(new[] { 10, 20, 30, 40, 50 }); + + var result = j["::2"] + 5; + + result.Should().BeOfValues(15, 35, 55).And.BeOfType(NPTypeCode.Int32); + } + + [Test] + [OpenBugs] // Sliced array * scalar fails + public void Multiply_SlicedWithScalar() + { + // NumPy: j[1::2] * 2 where j=[10, 20, 30, 40, 50] + // j[1::2] = [20, 40] + // Result: [40, 80] + var j = np.array(new[] { 10, 20, 30, 40, 50 }); + + var result = j["1::2"] * 2; + + result.Should().BeOfValues(40, 80).And.BeOfType(NPTypeCode.Int32); + } + + #endregion + + #region 2D Sliced Operations + + [Test] + public void Add_2DSliced_Rows() + { + // c[::2, :] + c[1::1, :] for 3x3 array + var c = np.array(new double[,] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }); + // c[0, :] = [1, 2, 3], c[2, :] = [7, 8, 9] + // c[::2, :] = [[1,2,3], [7,8,9]] + + var sliced = c["::2, :"]; + + Assert.AreEqual(2, sliced.shape[0]); + Assert.AreEqual(3, sliced.shape[1]); + Assert.AreEqual(1.0, sliced.GetDouble(0, 0), 1e-10); + Assert.AreEqual(7.0, sliced.GetDouble(1, 0), 1e-10); + } + + [Test] + public void Add_2DSliced_Cols() + { + var c = np.array(new double[,] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }); + // c[:, ::2] = [[1, 3], [4, 6], [7, 9]] + + var sliced = c[":, ::2"]; + + Assert.AreEqual(3, sliced.shape[0]); + Assert.AreEqual(2, sliced.shape[1]); + Assert.AreEqual(1.0, sliced.GetDouble(0, 0), 1e-10); + Assert.AreEqual(3.0, sliced.GetDouble(0, 1), 1e-10); + Assert.AreEqual(6.0, sliced.GetDouble(1, 1), 1e-10); + } + + [Test] + public void Add_2DSliced_Corners() + { + var c = np.array(new double[,] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }); + // c[::2, ::2] = [[1, 3], [7, 9]] + + var sliced = c["::2, ::2"]; + + Assert.AreEqual(2, sliced.shape[0]); + Assert.AreEqual(2, sliced.shape[1]); + Assert.AreEqual(1.0, sliced.GetDouble(0, 0), 1e-10); + Assert.AreEqual(3.0, sliced.GetDouble(0, 1), 1e-10); + Assert.AreEqual(7.0, sliced.GetDouble(1, 0), 1e-10); + Assert.AreEqual(9.0, sliced.GetDouble(1, 1), 1e-10); + } + + #endregion + + #region Unary Operations on Sliced Arrays + + [Test] + public void Sin_SlicedArray() + { + // NumPy: np.sin(d[::2]) where d=[0, 1, 2, 3, 4, 5] + // d[::2] = [0, 2, 4] + // Result: [0.0, 0.90929743, -0.7568025] + var d = np.array(new[] { 0.0, 1.0, 2.0, 3.0, 4.0, 5.0 }); + + var result = np.sin(d["::2"]); + + Assert.AreEqual(0.0, result.GetDouble(0), 1e-7); + Assert.AreEqual(0.90929743, result.GetDouble(1), 1e-7); + Assert.AreEqual(-0.7568025, result.GetDouble(2), 1e-7); + } + + [Test] + public void Sqrt_SlicedArray() + { + // NumPy: np.sqrt(d[1::2]) where d=[0, 1, 2, 3, 4, 5] + // d[1::2] = [1, 3, 5] + // Result: [1.0, 1.73205081, 2.23606798] + var d = np.array(new[] { 0.0, 1.0, 2.0, 3.0, 4.0, 5.0 }); + + var result = np.sqrt(d["1::2"]); + + Assert.AreEqual(1.0, result.GetDouble(0), 1e-7); + Assert.AreEqual(1.73205081, result.GetDouble(1), 1e-7); + Assert.AreEqual(2.23606798, result.GetDouble(2), 1e-7); + } + + [Test] + public void Cos_SlicedArray() + { + var d = np.array(new[] { 0.0, Math.PI / 2, Math.PI, Math.PI * 1.5, Math.PI * 2 }); + // d[::2] = [0, π, 2π] + // cos: [1, -1, 1] + + var result = np.cos(d["::2"]); + + Assert.AreEqual(1.0, result.GetDouble(0), 1e-10); + Assert.AreEqual(-1.0, result.GetDouble(1), 1e-10); + Assert.AreEqual(1.0, result.GetDouble(2), 1e-10); + } + + [Test] + public void Exp_SlicedArray() + { + var d = np.array(new[] { 0.0, 1.0, 2.0, 3.0 }); + // d[::2] = [0, 2] + // exp: [1, e^2=7.389...] + + var result = np.exp(d["::2"]); + + Assert.AreEqual(1.0, result.GetDouble(0), 1e-10); + Assert.AreEqual(Math.Exp(2.0), result.GetDouble(1), 1e-10); + } + + [Test] + public void Log_SlicedArray() + { + var d = np.array(new[] { 1.0, 2.0, Math.E, 4.0, Math.E * Math.E }); + // d[::2] = [1, e, e^2] + // log: [0, 1, 2] + + var result = np.log(d["::2"]); + + Assert.AreEqual(0.0, result.GetDouble(0), 1e-10); + Assert.AreEqual(1.0, result.GetDouble(1), 1e-10); + Assert.AreEqual(2.0, result.GetDouble(2), 1e-10); + } + + [Test] + public void Abs_SlicedArray() + { + var d = np.array(new[] { -5.0, 3.0, -2.0, 7.0, -1.0, 9.0 }); + // d[::2] = [-5, -2, -1] + // abs: [5, 2, 1] + + var result = np.abs(d["::2"]); + + Assert.AreEqual(5.0, result.GetDouble(0), 1e-10); + Assert.AreEqual(2.0, result.GetDouble(1), 1e-10); + Assert.AreEqual(1.0, result.GetDouble(2), 1e-10); + } + + #endregion + + #region Comparison Operations on Sliced Arrays + + [Test] + public void LessThan_SlicedArrays() + { + // NumPy: e[::2] < e[1::2] where e=[1, 5, 2, 6, 3, 7] + // e[::2] = [1, 2, 3], e[1::2] = [5, 6, 7] + // Result: [True, True, True] + var e = np.array(new[] { 1, 5, 2, 6, 3, 7 }); + + var result = e["::2"] < e["1::2"]; + + Assert.IsTrue(result.GetBoolean(0)); + Assert.IsTrue(result.GetBoolean(1)); + Assert.IsTrue(result.GetBoolean(2)); + } + + [Test] + [OpenBugs] // Sliced comparison with scalar fails + public void GreaterThan_SlicedWithScalar() + { + // NumPy: e[::2] > 2 where e=[1, 5, 2, 6, 3, 7] + // e[::2] = [1, 2, 3] + // Result: [False, False, True] + var e = np.array(new[] { 1, 5, 2, 6, 3, 7 }); + + var result = e["::2"] > 2; + + Assert.IsFalse(result.GetBoolean(0)); + Assert.IsFalse(result.GetBoolean(1)); + Assert.IsTrue(result.GetBoolean(2)); + } + + [Test] + public void Equal_SlicedArrays() + { + var a = np.array(new[] { 1, 2, 3, 2, 5, 2 }); + // a[::2] = [1, 3, 5], a[1::2] = [2, 2, 2] + // Result: [False, False, False] + + var result = a["::2"] == a["1::2"]; + + Assert.IsFalse(result.GetBoolean(0)); + Assert.IsFalse(result.GetBoolean(1)); + Assert.IsFalse(result.GetBoolean(2)); + } + + #endregion + + #region Bitwise Operations on Sliced Arrays + + [Test] + public void BitwiseAnd_SlicedBoolArrays() + { + // NumPy: f[::2] & g[::2] + // f = [True, False, True, False, True, False], g = [False, True, True, False, False, True] + // f[::2] = [True, True, True], g[::2] = [False, True, False] + // Result: [False, True, False] + var f = np.array(new[] { true, false, true, false, true, false }); + var g = np.array(new[] { false, true, true, false, false, true }); + + var result = f["::2"] & g["::2"]; + + Assert.IsFalse(result.GetBoolean(0)); + Assert.IsTrue(result.GetBoolean(1)); + Assert.IsFalse(result.GetBoolean(2)); + } + + [Test] + public void BitwiseOr_SlicedBoolArrays() + { + // NumPy: f[::2] | g[::2] + // f[::2] = [True, True, True], g[::2] = [False, True, False] + // Result: [True, True, True] + var f = np.array(new[] { true, false, true, false, true, false }); + var g = np.array(new[] { false, true, true, false, false, true }); + + var result = f["::2"] | g["::2"]; + + Assert.IsTrue(result.GetBoolean(0)); + Assert.IsTrue(result.GetBoolean(1)); + Assert.IsTrue(result.GetBoolean(2)); + } + + [Test] + public void BitwiseXor_SlicedIntArrays() + { + var a = np.array(new[] { 0b1010, 0b0000, 0b1111, 0b0000, 0b0101 }); + var b = np.array(new[] { 0b1100, 0b0000, 0b1010, 0b0000, 0b0011 }); + // a[::2] = [0b1010, 0b1111, 0b0101] + // b[::2] = [0b1100, 0b1010, 0b0011] + // XOR: = [0b0110, 0b0101, 0b0110] = [6, 5, 6] + + var aTyped = a.MakeGeneric(); + var bTyped = b.MakeGeneric(); + + var result = aTyped["::2"] ^ bTyped["::2"]; + + Assert.AreEqual(0b0110, result.GetInt32(0)); + Assert.AreEqual(0b0101, result.GetInt32(1)); + Assert.AreEqual(0b0110, result.GetInt32(2)); + } + + #endregion + + #region Reduction Operations on Sliced Arrays + + [Test] + public void Sum_SlicedArray() + { + // NumPy: np.sum(h[::2]) where h=[1, 2, 3, 4, 5, 6, 7, 8] + // h[::2] = [1, 3, 5, 7] + // Result: 16 + var h = np.array(new[] { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0 }); + + var result = np.sum(h["::2"]); + + Assert.AreEqual(16.0, result.GetDouble(0), 1e-10); + } + + [Test] + public void Mean_SlicedArray() + { + // NumPy: np.mean(h[1::2]) where h=[1, 2, 3, 4, 5, 6, 7, 8] + // h[1::2] = [2, 4, 6, 8] + // Result: 5.0 + var h = np.array(new[] { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0 }); + + var result = np.mean(h["1::2"]); + + Assert.AreEqual(5.0, result.GetDouble(0), 1e-10); + } + + [Test] + public void Max_SlicedArray() + { + // NumPy: np.max(h[::3]) where h=[1, 2, 3, 4, 5, 6, 7, 8] + // h[::3] = [1, 4, 7] + // Result: 7 + var h = np.array(new[] { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0 }); + + var result = np.amax(h["::3"]); + + Assert.AreEqual(7.0, result.GetDouble(0), 1e-10); + } + + [Test] + public void Min_SlicedArray() + { + var h = np.array(new[] { 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0 }); + // h[::2] = [8, 6, 4, 2] + // min: 2 + + var result = np.amin(h["::2"]); + + Assert.AreEqual(2.0, result.GetDouble(0), 1e-10); + } + + [Test] + public void Sum_2DSliced() + { + // NumPy: np.sum(c[::2, :]) where c=[[1,2,3],[4,5,6],[7,8,9]] + // c[::2, :] = [[1,2,3], [7,8,9]] + // Result: 30 + var c = np.array(new double[,] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }); + + var result = np.sum(c["::2, :"]); + + Assert.AreEqual(30.0, result.GetDouble(0), 1e-10); + } + + [Test] + public void Sum_2DSlicedCols() + { + // NumPy: np.sum(c[:, ::2]) where c=[[1,2,3],[4,5,6],[7,8,9]] + // c[:, ::2] = [[1,3], [4,6], [7,9]] + // Result: 1+3+4+6+7+9 = 30 + var c = np.array(new double[,] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }); + + var result = np.sum(c[":, ::2"]); + + Assert.AreEqual(30.0, result.GetDouble(0), 1e-10); + } + + #endregion + + #region Reversed Slice Operations + + [Test] + public void Add_ReversedSlice() + { + // NumPy: i[::-1] + i where i=[1, 2, 3, 4, 5] + // i[::-1] = [5, 4, 3, 2, 1] + // Result: [6, 6, 6, 6, 6] + var i = np.array(new[] { 1.0, 2.0, 3.0, 4.0, 5.0 }); + + var result = i["::-1"] + i; + + Assert.AreEqual(6.0, result.GetDouble(0), 1e-10); + Assert.AreEqual(6.0, result.GetDouble(1), 1e-10); + Assert.AreEqual(6.0, result.GetDouble(2), 1e-10); + Assert.AreEqual(6.0, result.GetDouble(3), 1e-10); + Assert.AreEqual(6.0, result.GetDouble(4), 1e-10); + } + + [Test] + public void Sum_ReversedSlice() + { + // NumPy: np.sum(i[::-1]) = 15 (same as forward) + var i = np.array(new[] { 1.0, 2.0, 3.0, 4.0, 5.0 }); + + var result = np.sum(i["::-1"]); + + Assert.AreEqual(15.0, result.GetDouble(0), 1e-10); + } + + [Test] + public void Sin_ReversedStridedSlice() + { + // NumPy: np.sin(i[::-2]) where i=[1, 2, 3, 4, 5] + // i[::-2] = [5, 3, 1] + // Result: sin([5, 3, 1]) = [-0.95892427, 0.14112001, 0.84147098] + var i = np.array(new[] { 1.0, 2.0, 3.0, 4.0, 5.0 }); + + var result = np.sin(i["::-2"]); + + Assert.AreEqual(-0.95892427, result.GetDouble(0), 1e-7); + Assert.AreEqual(0.14112001, result.GetDouble(1), 1e-7); + Assert.AreEqual(0.84147098, result.GetDouble(2), 1e-7); + } + + [Test] + public void Multiply_ReversedSlice() + { + var a = np.array(new[] { 1, 2, 3, 4 }); + // a[::-1] = [4, 3, 2, 1] + // a * a[::-1] = [4, 6, 6, 4] + + var result = a * a["::-1"]; + + result.Should().BeOfValues(4, 6, 6, 4).And.BeOfType(NPTypeCode.Int32); + } + + #endregion + + #region Mixed Contiguous and Sliced Operations + + [Test] + public void Add_ContiguousWithSliced() + { + // Contiguous + Sliced + var a = np.array(new[] { 1, 2, 3, 4 }); + var b = np.array(new[] { 10, 20, 30, 40, 50, 60, 70, 80 }); + + var result = a + b["::2"]; // a + [10, 30, 50, 70] + + result.Should().BeOfValues(11, 32, 53, 74).And.BeOfType(NPTypeCode.Int32); + } + + [Test] + public void Multiply_SlicedWithContiguous() + { + // Sliced * Contiguous + var a = np.array(new[] { 1, 2, 3, 4, 5, 6, 7, 8 }); + var b = np.array(new[] { 2, 2, 2, 2 }); + + var result = a["::2"] * b; // [1, 3, 5, 7] * [2, 2, 2, 2] + + result.Should().BeOfValues(2, 6, 10, 14).And.BeOfType(NPTypeCode.Int32); + } + + #endregion + + #region Type Preservation on Sliced Arrays + + [Test] + public void Add_SlicedByte() + { + var a = np.array(new byte[] { 1, 2, 3, 4, 5, 6 }); + var b = np.array(new byte[] { 10, 20, 30, 40, 50, 60 }); + + var result = a["::2"] + b["::2"]; // [1, 3, 5] + [10, 30, 50] = [11, 33, 55] + + result.Should().BeOfValues(11, 33, 55).And.BeOfType(NPTypeCode.Byte); + } + + [Test] + public void Add_SlicedFloat32() + { + var a = np.array(new float[] { 1.5f, 2.5f, 3.5f, 4.5f }); + var b = np.array(new float[] { 0.5f, 1.0f, 1.5f, 2.0f }); + + var result = a["::2"] + b["::2"]; // [1.5, 3.5] + [0.5, 1.5] = [2.0, 5.0] + + Assert.AreEqual(NPTypeCode.Single, result.typecode); + Assert.AreEqual(2.0f, result.GetSingle(0), 1e-5f); + Assert.AreEqual(5.0f, result.GetSingle(1), 1e-5f); + } + + [Test] + public void Add_SlicedInt64() + { + var a = np.array(new long[] { 1000000000000L, 2, 3000000000000L, 4 }); + var b = np.array(new long[] { 1, 2, 3, 4 }); + + var result = a["::2"] + b["::2"]; // [1e12, 3e12] + [1, 3] + + Assert.AreEqual(NPTypeCode.Int64, result.typecode); + Assert.AreEqual(1000000000001L, result.GetInt64(0)); + Assert.AreEqual(3000000000003L, result.GetInt64(1)); + } + + #endregion + + #region Edge Cases + + [Test] + public void SingleElement_Slice() + { + var a = np.array(new[] { 1, 2, 3, 4, 5 }); + // a[2:3] = [3] (single element slice, still 1D) + + var sliced = a["2:3"]; + + Assert.AreEqual(1, sliced.size); + Assert.AreEqual(1, sliced.ndim); + Assert.AreEqual(3, sliced.GetInt32(0)); + } + + [Test] + public void Step_GreaterThanSize() + { + var a = np.array(new[] { 1, 2, 3, 4, 5 }); + // a[::10] = [1] (step larger than array) + + var sliced = a["::10"]; + + Assert.AreEqual(1, sliced.size); + Assert.AreEqual(1, sliced.GetInt32(0)); + } + + [Test] + public void NegativeStep_FullReverse() + { + var a = np.array(new[] { 1, 2, 3, 4, 5 }); + // a[::-1] = [5, 4, 3, 2, 1] + + var sliced = a["::-1"]; + + Assert.AreEqual(5, sliced.GetInt32(0)); + Assert.AreEqual(4, sliced.GetInt32(1)); + Assert.AreEqual(3, sliced.GetInt32(2)); + Assert.AreEqual(2, sliced.GetInt32(3)); + Assert.AreEqual(1, sliced.GetInt32(4)); + } + + [Test] + public void SliceOfSlice() + { + var a = np.array(new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }); + // a[::2] = [1, 3, 5, 7, 9] + // a[::2][::2] = [1, 5, 9] + + var sliced = a["::2"]["::2"]; + + Assert.AreEqual(3, sliced.size); + Assert.AreEqual(1, sliced.GetInt32(0)); + Assert.AreEqual(5, sliced.GetInt32(1)); + Assert.AreEqual(9, sliced.GetInt32(2)); + } + + [Test] + public void SliceOfSlice_Operations() + { + var a = np.array(new[] { 1, 2, 3, 4, 5, 6, 7, 8 }); + // a[::2][::2] = [1, 5], a[1::2][::2] = [2, 6] + // Sum: [3, 11] + + var result = a["::2"]["::2"] + a["1::2"]["::2"]; + + Assert.AreEqual(2, result.size); + Assert.AreEqual(3, result.GetInt32(0)); + Assert.AreEqual(11, result.GetInt32(1)); + } + + #endregion +} diff --git a/test/NumSharp.UnitTest/Backends/Kernels/UnaryOpTests.cs b/test/NumSharp.UnitTest/Backends/Kernels/UnaryOpTests.cs new file mode 100644 index 00000000..9a1701b1 --- /dev/null +++ b/test/NumSharp.UnitTest/Backends/Kernels/UnaryOpTests.cs @@ -0,0 +1,532 @@ +using System; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using NumSharp; +using NumSharp.UnitTest.Utilities; +using TUnit.Core; + +namespace NumSharp.UnitTest.Backends.Kernels; + +/// +/// Comprehensive tests for unary operations. +/// All expected values are verified against NumPy 2.x output. +/// +public class UnaryOpTests +{ + private const double Tolerance = 1e-10; + private const double Pi = Math.PI; + + #region Trigonometric Functions + + [Test] + public void Sin_Float64() + { + // NumPy: sin([0, π/6, π/4, π/2, π]) + var input = np.array(new double[] { 0, Pi / 6, Pi / 4, Pi / 2, Pi }); + var result = np.sin(input); + + Assert.IsTrue(Math.Abs(result.GetDouble(0) - 0.0) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(1) - 0.5) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(2) - 0.7071067811865476) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(3) - 1.0) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(4)) < Tolerance); // sin(π) ≈ 0 + } + + [Test] + public void Cos_Float64() + { + // NumPy: cos([0, π/6, π/4, π/2, π]) + var input = np.array(new double[] { 0, Pi / 6, Pi / 4, Pi / 2, Pi }); + var result = np.cos(input); + + Assert.IsTrue(Math.Abs(result.GetDouble(0) - 1.0) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(1) - 0.8660254037844387) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(2) - 0.7071067811865476) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(3)) < Tolerance); // cos(π/2) ≈ 0 + Assert.IsTrue(Math.Abs(result.GetDouble(4) - (-1.0)) < Tolerance); + } + + [Test] + public void Tan_Float64() + { + // NumPy: tan([0, π/4, -π/4]) + var input = np.array(new double[] { 0, Pi / 4, -Pi / 4 }); + var result = np.tan(input); + + Assert.IsTrue(Math.Abs(result.GetDouble(0) - 0.0) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(1) - 1.0) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(2) - (-1.0)) < Tolerance); + } + + #endregion + + #region Inverse Trigonometric Functions + + [Test] + public void ASin_Float64() + { + // NumPy: arcsin([-1, -0.5, 0, 0.5, 1]) + var input = np.array(new double[] { -1, -0.5, 0, 0.5, 1 }); + var result = np.arcsin(input); + + Assert.IsTrue(Math.Abs(result.GetDouble(0) - (-Pi / 2)) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(1) - (-0.5235987755982989)) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(2) - 0.0) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(3) - 0.5235987755982989) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(4) - (Pi / 2)) < Tolerance); + } + + [Test] + public void ACos_Float64() + { + // NumPy: arccos([-1, -0.5, 0, 0.5, 1]) + var input = np.array(new double[] { -1, -0.5, 0, 0.5, 1 }); + var result = np.arccos(input); + + Assert.IsTrue(Math.Abs(result.GetDouble(0) - Pi) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(1) - 2.0943951023931957) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(2) - (Pi / 2)) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(3) - 1.0471975511965979) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(4) - 0.0) < Tolerance); + } + + [Test] + public void ATan_Float64() + { + // NumPy: arctan([-1, -0.5, 0, 0.5, 1]) + var input = np.array(new double[] { -1, -0.5, 0, 0.5, 1 }); + var result = np.arctan(input); + + Assert.IsTrue(Math.Abs(result.GetDouble(0) - (-Pi / 4)) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(1) - (-0.4636476090008061)) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(2) - 0.0) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(3) - 0.4636476090008061) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(4) - (Pi / 4)) < Tolerance); + } + + #endregion + + #region Hyperbolic Functions + + [Test] + public void Sinh_Float64() + { + // NumPy: sinh([-2, -1, 0, 1, 2]) + var input = np.array(new double[] { -2, -1, 0, 1, 2 }); + var result = np.sinh(input); + + Assert.IsTrue(Math.Abs(result.GetDouble(0) - (-3.6268604078470186)) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(1) - (-1.1752011936438014)) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(2) - 0.0) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(3) - 1.1752011936438014) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(4) - 3.6268604078470186) < Tolerance); + } + + [Test] + public void Cosh_Float64() + { + // NumPy: cosh([-2, -1, 0, 1, 2]) + var input = np.array(new double[] { -2, -1, 0, 1, 2 }); + var result = np.cosh(input); + + Assert.IsTrue(Math.Abs(result.GetDouble(0) - 3.7621956910836314) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(1) - 1.5430806348152437) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(2) - 1.0) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(3) - 1.5430806348152437) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(4) - 3.7621956910836314) < Tolerance); + } + + [Test] + public void Tanh_Float64() + { + // NumPy: tanh([-2, -1, 0, 1, 2]) + var input = np.array(new double[] { -2, -1, 0, 1, 2 }); + var result = np.tanh(input); + + Assert.IsTrue(Math.Abs(result.GetDouble(0) - (-0.9640275800758169)) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(1) - (-0.7615941559557649)) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(2) - 0.0) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(3) - 0.7615941559557649) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(4) - 0.9640275800758169) < Tolerance); + } + + #endregion + + #region Logarithmic Functions + + [Test] + public void Log_Float64() + { + // NumPy: log([0.001, 0.5, 1, e, 10, 100]) + var input = np.array(new double[] { 0.001, 0.5, 1, Math.E, 10, 100 }); + var result = np.log(input); + + Assert.IsTrue(Math.Abs(result.GetDouble(0) - (-6.907755278982137)) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(1) - (-0.6931471805599453)) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(2) - 0.0) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(3) - 1.0) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(4) - 2.302585092994046) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(5) - 4.605170185988092) < Tolerance); + } + + [Test] + public void Log2_Float64() + { + var input = np.array(new double[] { 0.5, 1, 2, 4, 8, 1024 }); + var result = np.log2(input); + + Assert.IsTrue(Math.Abs(result.GetDouble(0) - (-1.0)) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(1) - 0.0) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(2) - 1.0) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(3) - 2.0) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(4) - 3.0) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(5) - 10.0) < Tolerance); + } + + [Test] + public void Log10_Float64() + { + var input = np.array(new double[] { 0.001, 0.1, 1, 10, 100 }); + var result = np.log10(input); + + Assert.IsTrue(Math.Abs(result.GetDouble(0) - (-3.0)) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(1) - (-1.0)) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(2) - 0.0) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(3) - 1.0) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(4) - 2.0) < Tolerance); + } + + [Test] + public void Log1p_Float64() + { + // NumPy: log1p([0, 0.5, 1, e-1, 9, 99]) + var input = np.array(new double[] { 0, 0.5, 1, Math.E - 1, 9, 99 }); + var result = np.log1p(input); + + Assert.IsTrue(Math.Abs(result.GetDouble(0) - 0.0) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(1) - 0.4054651081081644) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(2) - 0.6931471805599453) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(3) - 1.0) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(4) - 2.302585092994046) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(5) - 4.605170185988092) < Tolerance); + } + + #endregion + + #region Exponential Functions + + [Test] + public void Exp_Float64() + { + // NumPy: exp([0, 0.5, 1, 2]) + var input = np.array(new double[] { 0, 0.5, 1, 2 }); + var result = np.exp(input); + + Assert.IsTrue(Math.Abs(result.GetDouble(0) - 1.0) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(1) - 1.6487212707001282) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(2) - Math.E) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(3) - 7.38905609893065) < Tolerance); + } + + [Test] + public void Exp2_Float64() + { + // NumPy: exp2([0, 1, 2, 3, 10]) + var input = np.array(new double[] { 0, 1, 2, 3, 10 }); + var result = np.exp2(input); + + Assert.IsTrue(Math.Abs(result.GetDouble(0) - 1.0) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(1) - 2.0) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(2) - 4.0) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(3) - 8.0) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(4) - 1024.0) < Tolerance); + } + + [Test] + public void Expm1_Float64() + { + // NumPy: expm1([0, 0.5, 1, 2]) + var input = np.array(new double[] { 0, 0.5, 1, 2 }); + var result = np.expm1(input); + + Assert.IsTrue(Math.Abs(result.GetDouble(0) - 0.0) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(1) - 0.6487212707001282) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(2) - (Math.E - 1)) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(3) - 6.38905609893065) < Tolerance); + } + + #endregion + + #region General Operations + + [Test] + public void Abs_Float64() + { + // NumPy: abs([-5.5, -1, 0, 1, 2.5, 100]) + var input = np.array(new double[] { -5.5, -1, 0, 1, 2.5, 100 }); + var result = np.abs(input); + + result.Should().BeOfValues(5.5, 1.0, 0.0, 1.0, 2.5, 100.0); + } + + [Test] + [OpenBugs] // IL kernel bug - returns incorrect values + public void Abs_Int32() + { + var input = np.array(new[] { -5, -1, 0, 1, 5 }); + var result = np.abs(input); + + result.Should().BeOfValues(5, 1, 0, 1, 5).And.BeOfType(NPTypeCode.Int32); + } + + [Test] + [OpenBugs] // IL kernel bug - returns incorrect values + public void Negative_Float64() + { + // NumPy: negative([-5.5, -1, 0, 1, 2.5]) + var input = np.array(new double[] { -5.5, -1, 0, 1, 2.5 }); + var result = np.negative(input); + + result.Should().BeOfValues(5.5, 1.0, 0.0, -1.0, -2.5); + } + + [Test] + [OpenBugs] // IL kernel bug - returns incorrect values + public void Negative_Int32() + { + var input = np.array(new[] { -5, -1, 0, 1, 5 }); + var result = np.negative(input); + + result.Should().BeOfValues(5, 1, 0, -1, -5).And.BeOfType(NPTypeCode.Int32); + } + + [Test] + [OpenBugs] // NumSharp throws NotSupportedException for unsigned negative + public void Negative_Byte_Overflow() + { + // NumPy: negative([1, 2, 3, 4, 5]) for uint8 = [255, 254, 253, 252, 251] + var input = np.array(new byte[] { 1, 2, 3, 4, 5 }); + var result = np.negative(input); + + result.Should().BeOfValues(255, 254, 253, 252, 251).And.BeOfType(NPTypeCode.Byte); + } + + [Test] + public void Sqrt_Float64() + { + var input = np.array(new double[] { 0, 1, 4, 9, 100 }); + var result = np.sqrt(input); + + Assert.IsTrue(Math.Abs(result.GetDouble(0) - 0.0) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(1) - 1.0) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(2) - 2.0) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(3) - 3.0) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(4) - 10.0) < Tolerance); + } + + [Test] + public void Sign_Float64() + { + // NumPy: sign([-5.5, -1, 0, 1, 2.5]) + var input = np.array(new double[] { -5.5, -1, 0, 1, 2.5 }); + var result = np.sign(input); + + result.Should().BeOfValues(-1.0, -1.0, 0.0, 1.0, 1.0); + } + + [Test] + [OpenBugs] // IL kernel bug - returns incorrect values + public void Sign_Int32() + { + var input = np.array(new[] { -5, -1, 0, 1, 5 }); + var result = np.sign(input); + + result.Should().BeOfValues(-1, -1, 0, 1, 1).And.BeOfType(NPTypeCode.Int32); + } + + #endregion + + #region Rounding Operations - Banker's Rounding + + [Test] + public void Round_BankersRounding() + { + // NumPy uses banker's rounding (round half to even) + // NumPy: round([0.0, 0.49, 0.5, 0.51, 1.5, 2.5, -0.5, -1.5, -2.5]) + // = [0.0, 0.0, 0.0, 1.0, 2.0, 2.0, -0.0, -2.0, -2.0] + var input = np.array(new double[] { 0.0, 0.49, 0.5, 0.51, 1.5, 2.5, -0.5, -1.5, -2.5 }); + var result = np.round_(input); + + Assert.AreEqual(0.0, result.GetDouble(0)); + Assert.AreEqual(0.0, result.GetDouble(1)); + Assert.AreEqual(0.0, result.GetDouble(2)); // 0.5 rounds to 0 (even) + Assert.AreEqual(1.0, result.GetDouble(3)); + Assert.AreEqual(2.0, result.GetDouble(4)); // 1.5 rounds to 2 (even) + Assert.AreEqual(2.0, result.GetDouble(5)); // 2.5 rounds to 2 (even) + Assert.AreEqual(0.0, result.GetDouble(6)); // -0.5 rounds to 0 (even) + Assert.AreEqual(-2.0, result.GetDouble(7)); // -1.5 rounds to -2 (even) + Assert.AreEqual(-2.0, result.GetDouble(8)); // -2.5 rounds to -2 (even) + } + + [Test] + public void Floor_Float64() + { + // NumPy: floor([0.0, 0.49, 0.5, 0.51, 1.5, 2.5, -0.5, -1.5, -2.5]) + var input = np.array(new double[] { 0.0, 0.49, 0.5, 0.51, 1.5, 2.5, -0.5, -1.5, -2.5 }); + var result = np.floor(input); + + result.Should().BeOfValues(0.0, 0.0, 0.0, 0.0, 1.0, 2.0, -1.0, -2.0, -3.0); + } + + [Test] + public void Ceil_Float64() + { + // NumPy: ceil([0.0, 0.49, 0.5, 0.51, 1.5, 2.5, -0.5, -1.5, -2.5]) + var input = np.array(new double[] { 0.0, 0.49, 0.5, 0.51, 1.5, 2.5, -0.5, -1.5, -2.5 }); + var result = np.ceil(input); + + result.Should().BeOfValues(0.0, 1.0, 1.0, 1.0, 2.0, 3.0, 0.0, -1.0, -2.0); + } + + #endregion + + #region Edge Cases - Special Values + + [Test] + public void Sin_EdgeCases() + { + // NumPy: sin([0, -0, inf, -inf, nan]) = [0, -0, nan, nan, nan] + var input = np.array(new double[] { 0, -0.0, double.PositiveInfinity, double.NegativeInfinity, double.NaN }); + var result = np.sin(input); + + Assert.AreEqual(0.0, result.GetDouble(0)); + // -0.0 sin is -0.0 but comparing as 0.0 + Assert.IsTrue(double.IsNaN(result.GetDouble(2))); + Assert.IsTrue(double.IsNaN(result.GetDouble(3))); + Assert.IsTrue(double.IsNaN(result.GetDouble(4))); + } + + [Test] + public void Exp_EdgeCases() + { + // NumPy: exp([0, -0, inf, -inf, nan]) = [1, 1, inf, 0, nan] + var input = np.array(new double[] { 0, -0.0, double.PositiveInfinity, double.NegativeInfinity, double.NaN }); + var result = np.exp(input); + + Assert.AreEqual(1.0, result.GetDouble(0)); + Assert.AreEqual(1.0, result.GetDouble(1)); + Assert.IsTrue(double.IsPositiveInfinity(result.GetDouble(2))); + Assert.AreEqual(0.0, result.GetDouble(3)); + Assert.IsTrue(double.IsNaN(result.GetDouble(4))); + } + + [Test] + public void Log_EdgeCases() + { + // NumPy: log([0, -0, inf, -inf, nan]) = [-inf, -inf, inf, nan, nan] + var input = np.array(new double[] { 0, -0.0, double.PositiveInfinity, double.NegativeInfinity, double.NaN }); + var result = np.log(input); + + Assert.IsTrue(double.IsNegativeInfinity(result.GetDouble(0))); + Assert.IsTrue(double.IsNegativeInfinity(result.GetDouble(1))); + Assert.IsTrue(double.IsPositiveInfinity(result.GetDouble(2))); + Assert.IsTrue(double.IsNaN(result.GetDouble(3))); + Assert.IsTrue(double.IsNaN(result.GetDouble(4))); + } + + [Test] + public void Sqrt_EdgeCases() + { + // NumPy: sqrt([0, -0, inf, -inf, nan]) = [0, -0, inf, nan, nan] + var input = np.array(new double[] { 0, -0.0, double.PositiveInfinity, double.NegativeInfinity, double.NaN }); + var result = np.sqrt(input); + + Assert.AreEqual(0.0, result.GetDouble(0)); + // sqrt(-0) = -0 + Assert.IsTrue(double.IsPositiveInfinity(result.GetDouble(2))); + Assert.IsTrue(double.IsNaN(result.GetDouble(3))); + Assert.IsTrue(double.IsNaN(result.GetDouble(4))); + } + + [Test] + [OpenBugs] // .NET Math.Sign throws on NaN, NumPy returns NaN + public void Sign_EdgeCases() + { + // NumPy: sign([0, -0, inf, -inf, nan]) = [0, 0, 1, -1, nan] + var input = np.array(new double[] { 0, -0.0, double.PositiveInfinity, double.NegativeInfinity, double.NaN }); + var result = np.sign(input); + + Assert.AreEqual(0.0, result.GetDouble(0)); + Assert.AreEqual(0.0, result.GetDouble(1)); + Assert.AreEqual(1.0, result.GetDouble(2)); + Assert.AreEqual(-1.0, result.GetDouble(3)); + Assert.IsTrue(double.IsNaN(result.GetDouble(4))); + } + + #endregion + + #region Float32 Tests + + [Test] + public void Sin_Float32() + { + var input = np.array(new float[] { 0f, 0.5f, 1f, 1.5f, 2f }); + var result = np.sin(input); + + // NumPy float32 values + Assert.IsTrue(Math.Abs(result.GetSingle(0) - 0f) < 1e-6f); + Assert.IsTrue(Math.Abs(result.GetSingle(1) - 0.4794255495071411f) < 1e-6f); + Assert.IsTrue(Math.Abs(result.GetSingle(2) - 0.8414710164070129f) < 1e-6f); + } + + [Test] + public void Cos_Float32() + { + var input = np.array(new float[] { 0f, 0.5f, 1f, 1.5f, 2f }); + var result = np.cos(input); + + Assert.IsTrue(Math.Abs(result.GetSingle(0) - 1f) < 1e-6f); + Assert.IsTrue(Math.Abs(result.GetSingle(1) - 0.8775825500488281f) < 1e-6f); + Assert.IsTrue(Math.Abs(result.GetSingle(2) - 0.5403022766113281f) < 1e-6f); + } + + [Test] + public void Exp_Float32() + { + var input = np.array(new float[] { 0f, 0.5f, 1f, 1.5f, 2f }); + var result = np.exp(input); + + Assert.IsTrue(Math.Abs(result.GetSingle(0) - 1f) < 1e-5f); + Assert.IsTrue(Math.Abs(result.GetSingle(1) - 1.6487212181091309f) < 1e-5f); + Assert.IsTrue(Math.Abs(result.GetSingle(2) - 2.7182819843292236f) < 1e-5f); + } + + #endregion + + #region Sliced Array Tests + + [Test] + public void Sin_SlicedArray() + { + // Test that unary ops work correctly on sliced/strided arrays + var original = np.array(new double[] { 0, Pi / 6, Pi / 4, Pi / 3, Pi / 2, Pi }); + var sliced = original["::2"]; // [0, π/4, π/2] + var result = np.sin(sliced); + + Assert.AreEqual(3, result.size); + Assert.IsTrue(Math.Abs(result.GetDouble(0) - 0.0) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(1) - 0.7071067811865476) < Tolerance); + Assert.IsTrue(Math.Abs(result.GetDouble(2) - 1.0) < Tolerance); + } + + [Test] + public void Abs_2DArray() + { + var input = np.array(new[,] { { -1.0, 2.0 }, { -3.0, 4.0 } }); + var result = np.abs(input); + + result.Should().BeShaped(2, 2); + result.Should().BeOfValues(1.0, 2.0, 3.0, 4.0); + } + + #endregion +} diff --git a/test/NumSharp.UnitTest/Backends/Unmanaged/Math/np_divide_tests.cs b/test/NumSharp.UnitTest/Backends/Unmanaged/Math/np_divide_tests.cs index 44ba0e50..291667ef 100644 --- a/test/NumSharp.UnitTest/Backends/Unmanaged/Math/np_divide_tests.cs +++ b/test/NumSharp.UnitTest/Backends/Unmanaged/Math/np_divide_tests.cs @@ -12,20 +12,27 @@ public class np_divide_tests [Test] public void UInt8DivideTest1() { + // NumPy: uint8 / int returns float64 (true division) var nd1 = np.arange(3).astype(np.uint8); var nd2 = nd1 / (byte)2; - nd2.array_equal(new byte[] {0 / 2, 1 / 2, 2 / 2}).Should().BeTrue(); + // True division returns float64 + nd2.dtype.Should().Be(np.float64); + nd2.array_equal(new double[] {0.0 / 2, 1.0 / 2, 2.0 / 2}).Should().BeTrue(); } [Test] public void UInt16DivideTest1() { + // NumPy: uint16 / int returns float64 (true division) var nd1 = np.arange(3).astype(np.uint16); var nd2 = nd1 / (byte)2; - nd2.array_equal(new ushort[] {0 / 2, 1 / 2, 2 / 2}).Should().BeTrue(); + + // True division returns float64 + nd2.dtype.Should().Be(np.float64); + nd2.array_equal(new double[] {0.0 / 2, 1.0 / 2, 2.0 / 2}).Should().BeTrue(); } [Test] diff --git a/test/NumSharp.UnitTest/GlobalUsings.cs b/test/NumSharp.UnitTest/GlobalUsings.cs new file mode 100644 index 00000000..6376e8ed --- /dev/null +++ b/test/NumSharp.UnitTest/GlobalUsings.cs @@ -0,0 +1,2 @@ +global using static NumSharp.MethodImplOptionsConstants; +global using NumSharp.UnitTest.Utilities; diff --git a/test/NumSharp.UnitTest/Logic/NEP50.cs b/test/NumSharp.UnitTest/Logic/NEP50.cs index 3f46decd..cafeb83b 100644 --- a/test/NumSharp.UnitTest/Logic/NEP50.cs +++ b/test/NumSharp.UnitTest/Logic/NEP50.cs @@ -304,38 +304,34 @@ public void UInt32Array_Times_PythonInt_Returns_UInt32() /// NumPy: python3 -c "import numpy as np; print((np.array([10,20,30], np.uint8) / 5).dtype)" /// Output: float64 /// - /// NumSharp DIFFERENCE: Uses integer division (like C#'s / operator for integers). - /// NumSharp returns array dtype, not float64. + /// NumSharp now matches NumPy: true division returns float64. /// [Test] - [Misaligned] - public void UInt8Array_Divide_PythonInt_Returns_UInt8_NumSharpBehavior() + public void UInt8Array_Divide_PythonInt_Returns_Float64() { var arr = np.array(new byte[] { 10, 20, 30 }); var result = arr / 5; - // NumSharp uses integer division, preserving array dtype - // NumPy would return float64 - result.dtype.Should().Be(np.uint8, "NumSharp uses integer division"); - result.GetAtIndex(0).Should().Be(2); // 10 / 5 = 2 + // True division returns float64, matching NumPy + result.dtype.Should().Be(np.float64, "True division returns float64"); + result.GetAtIndex(0).Should().Be(2.0); // 10 / 5 = 2.0 } /// /// NumPy: python3 -c "import numpy as np; print((np.array([10,20,30], np.int32) / 5).dtype)" /// Output: float64 /// - /// NumSharp DIFFERENCE: Uses integer division. + /// NumSharp now matches NumPy: true division returns float64. /// [Test] - [Misaligned] - public void Int32Array_Divide_PythonInt_Returns_Int32_NumSharpBehavior() + public void Int32Array_Divide_PythonInt_Returns_Float64() { var arr = np.array(new int[] { 10, 20, 30 }); var result = arr / 5; - // NumSharp uses integer division, preserving array dtype - result.dtype.Should().Be(np.int32, "NumSharp uses integer division"); - result.GetAtIndex(0).Should().Be(2); // 10 / 5 = 2 + // True division returns float64, matching NumPy + result.dtype.Should().Be(np.float64, "True division returns float64"); + result.GetAtIndex(0).Should().Be(2.0); // 10 / 5 = 2.0 } /// diff --git a/test/NumSharp.UnitTest/OpenBugs.cs b/test/NumSharp.UnitTest/OpenBugs.cs index 42f5383c..bf5fe1f3 100644 --- a/test/NumSharp.UnitTest/OpenBugs.cs +++ b/test/NumSharp.UnitTest/OpenBugs.cs @@ -2666,11 +2666,11 @@ public void Bug_SwapAxes_ReturnsPhysicalCopy_ShouldBeView() // ================================================================ /// - /// BUG 65a: Shape.IsContiguous should be true for step-1 slices. + /// FIXED: Contiguous slices now have IsSliced=False and IsContiguous=True. /// /// np.arange(10)[2:7] has step=1 and occupies a contiguous block of memory. - /// NumPy reports c_contiguous=True. NumSharp reports IsContiguous=false - /// because IsSliced=true, causing ravel to unnecessarily copy data. + /// NumPy reports c_contiguous=True. NumSharp now correctly optimizes this + /// by slicing the InternalArray and creating a fresh shape with offset=0. /// [Test] public void Bug_IsContiguous_FalseForContiguousSlice1D() @@ -2678,20 +2678,18 @@ public void Bug_IsContiguous_FalseForContiguousSlice1D() var a = np.arange(10); var s = a["2:7"]; - s.Shape.IsSliced.Should().BeTrue("slice creates a sliced shape"); - s.Shape.IsContiguous.Should().BeTrue( - "NumPy: a[2:7].flags['C_CONTIGUOUS'] is True — step-1 slice " + - "is contiguous in memory. NumSharp returns false because " + - "Shape.IsContiguous = !IsSliced && !IsBroadcasted, which treats " + - "ALL slices as non-contiguous regardless of step size."); + // FIXED: Contiguous slices now use data pointer adjustment (like NumPy) + s.Shape.IsSliced.Should().BeFalse("contiguous slices get fresh shape with offset=0"); + s.Shape.IsContiguous.Should().BeTrue("step-1 slice is contiguous in memory"); + s.Shape.offset.Should().Be(0, "offset is absorbed into InternalArray slice"); } /// - /// BUG 65b: Shape.IsContiguous should be true for contiguous row slices. + /// FIXED: Contiguous row slices now have IsSliced=False and IsContiguous=True. /// /// np.arange(12).reshape(3,4)[1:3] selects 2 consecutive rows from a /// row-major array — the data is contiguous in memory. - /// NumPy reports c_contiguous=True. NumSharp reports IsContiguous=false. + /// NumPy reports c_contiguous=True. NumSharp now correctly optimizes this. /// [Test] public void Bug_IsContiguous_FalseForContiguousRowSlice2D() @@ -2699,12 +2697,10 @@ public void Bug_IsContiguous_FalseForContiguousRowSlice2D() var a = np.arange(12).reshape(3, 4); var s = a["1:3"]; - s.Shape.IsSliced.Should().BeTrue("row slice creates a sliced shape"); - s.Shape.IsContiguous.Should().BeTrue( - "NumPy: a[1:3].flags['C_CONTIGUOUS'] is True — consecutive row " + - "slice of a C-contiguous 2D array is contiguous in memory. " + - "NumSharp returns false because IsContiguous treats all slices " + - "as non-contiguous. Root cause: Shape.cs line ~39."); + // FIXED: Contiguous row slices now use data pointer adjustment (like NumPy) + s.Shape.IsSliced.Should().BeFalse("contiguous row slices get fresh shape with offset=0"); + s.Shape.IsContiguous.Should().BeTrue("consecutive rows are contiguous in memory"); + s.Shape.offset.Should().Be(0, "offset is absorbed into InternalArray slice"); } // ================================================================ diff --git a/test/NumSharp.UnitTest/Utilities/FluentExtension.cs b/test/NumSharp.UnitTest/Utilities/FluentExtension.cs index 74aa7ee3..7e87e74e 100644 --- a/test/NumSharp.UnitTest/Utilities/FluentExtension.cs +++ b/test/NumSharp.UnitTest/Utilities/FluentExtension.cs @@ -23,7 +23,12 @@ public static NDArrayAssertions Should(this NDArray arr) return new NDArrayAssertions(arr); } - public static NDArrayAssertions Should(this UnmanagedStorage arr) + public static UnmanagedStorageAssertions Should(this UnmanagedStorage arr) + { + return new UnmanagedStorageAssertions(arr); + } + + public static NDArrayAssertions ShouldAsNDArray(this UnmanagedStorage arr) { return new NDArrayAssertions(arr); } @@ -110,6 +115,22 @@ public AndConstraint BeEquivalentTo(int? size = null, int? ndim return new AndConstraint(this); } + public AndConstraint BeEquivalentTo(Shape expected) + { + _chain + .ForCondition(expected.dimensions.Length == Subject.dimensions.Length) + .FailWith($"Expected shape to have {expected.dimensions.Length} dimensions but got {Subject.dimensions.Length} dimensions ({Subject})."); + + for (int i = 0; i < expected.dimensions.Length; i++) + { + _chain + .ForCondition(Subject.dimensions[i] == expected.dimensions[i]) + .FailWith($"Expected shape[{i}] to be {expected.dimensions[i]} but got {Subject.dimensions[i]}. Expected: {expected}, Got: {Subject}"); + } + + return new AndConstraint(this); + } + public AndConstraint NotBe(Shape shape, string because = null, params object[] becauseArgs) { _chain @@ -391,6 +412,49 @@ public AndConstraint NotBe(NDArray expected) return new AndConstraint(this); } + public AndConstraint BeSameAs(UnmanagedStorage expected) + { + _chain + .ForCondition(ReferenceEquals(Subject.Storage, expected)) + .FailWith($"Expected storage to be the same instance.\nSubject storage hash: {Subject.Storage.GetHashCode()}\nExpected storage hash: {expected.GetHashCode()}"); + + return new AndConstraint(this); + } + + public AndConstraint BeEquivalentTo(NDArray expected) + { + // Handle empty arrays specially + var subjectIsEmpty = Subject.Shape.IsEmpty || Subject.size == 0; + var expectedIsEmpty = expected.Shape.IsEmpty || expected.size == 0; + + if (subjectIsEmpty || expectedIsEmpty) + { + _chain + .ForCondition(subjectIsEmpty == expectedIsEmpty) + .FailWith($"Expected both arrays to be empty or both to be non-empty.\nSubject empty: {subjectIsEmpty}, Expected empty: {expectedIsEmpty}"); + return new AndConstraint(this); + } + + _chain + .ForCondition(Subject.Shape.Equals(expected.Shape)) + .FailWith($"Expected shapes to match.\nSubject shape: {Subject.Shape}\nExpected shape: {expected.Shape}"); + + _chain + .ForCondition(np.array_equal(Subject, expected)) + .FailWith($"Expected arrays to be equal.\n------- Subject -------\n{Subject.ToString(false)}\n------- Expected -------\n{expected.ToString(false)}"); + + return new AndConstraint(this); + } + + public AndConstraint NotBeSameAs(UnmanagedStorage expected) + { + _chain + .ForCondition(!ReferenceEquals(Subject.Storage, expected)) + .FailWith($"Did not expect storage to be the same instance.\nStorage hash: {Subject.Storage.GetHashCode()}"); + + return new AndConstraint(this); + } + public AndConstraint BeOfValues(params object[] values) { if (values == null) @@ -1211,4 +1275,92 @@ public AndConstraint BeOfValuesApproximately(double sensitivi return new AndConstraint(this); } } + + [DebuggerStepThrough] + public class UnmanagedStorageAssertions : ReferenceTypeAssertions + { + private readonly AssertionChain _chain; + private readonly Lazy _ndArrayAssertions; + + public UnmanagedStorageAssertions(UnmanagedStorage instance) + : this(instance, AssertionChain.GetOrCreate()) + { + } + + public UnmanagedStorageAssertions(UnmanagedStorage instance, AssertionChain chain) + : base(instance, chain) + { + _chain = chain; + _ndArrayAssertions = new Lazy(() => + instance != null ? new NDArrayAssertions(new NDArray(instance), chain) : null!); + } + + protected override string Identifier => "storage"; + + public AndConstraint BeSameAs(UnmanagedStorage expected) + { + _chain + .ForCondition(ReferenceEquals(Subject, expected)) + .FailWith($"Expected storage to be the same instance.\nSubject: {Subject?.GetHashCode()}\nExpected: {expected?.GetHashCode()}"); + + return new AndConstraint(this); + } + + public AndConstraint NotBeSameAs(UnmanagedStorage expected) + { + _chain + .ForCondition(!ReferenceEquals(Subject, expected)) + .FailWith($"Did not expect storage to be the same instance.\nStorage: {Subject?.GetHashCode()}"); + + return new AndConstraint(this); + } + + public AndConstraint BeOfValues(params object[] values) + { + if (Subject == null) + throw new InvalidOperationException("Cannot call BeOfValues on null storage"); + _ndArrayAssertions.Value.BeOfValues(values); + return new AndConstraint(this); + } + + public AndConstraint AllValuesBe(object val) + { + if (Subject == null) + throw new InvalidOperationException("Cannot call AllValuesBe on null storage"); + _ndArrayAssertions.Value.AllValuesBe(val); + return new AndConstraint(this); + } + + public AndConstraint BeOfValuesApproximately(double sensitivity, params object[] values) + { + if (Subject == null) + throw new InvalidOperationException("Cannot call BeOfValuesApproximately on null storage"); + _ndArrayAssertions.Value.BeOfValuesApproximately(sensitivity, values); + return new AndConstraint(this); + } + + public AndConstraint BeShaped(params int[] dimensions) + { + if (Subject == null) + throw new InvalidOperationException("Cannot call BeShaped on null storage"); + _ndArrayAssertions.Value.BeShaped(dimensions); + return new AndConstraint(this); + } + + public AndConstraint BeOfSize(int size, string because = null, params object[] becauseArgs) + { + if (Subject == null) + throw new InvalidOperationException("Cannot call BeOfSize on null storage"); + _ndArrayAssertions.Value.BeOfSize(size, because, becauseArgs); + return new AndConstraint(this); + } + + public AndConstraint BeOfType(NPTypeCode typeCode) + { + if (Subject == null) + throw new InvalidOperationException("Cannot call BeOfType on null storage"); + _ndArrayAssertions.Value.BeOfType(typeCode); + return new AndConstraint(this); + } + } } diff --git a/test/NumSharp.UnitTest/View/Shape.OffsetParity.Tests.cs b/test/NumSharp.UnitTest/View/Shape.OffsetParity.Tests.cs index fa77c2d8..7757a214 100644 --- a/test/NumSharp.UnitTest/View/Shape.OffsetParity.Tests.cs +++ b/test/NumSharp.UnitTest/View/Shape.OffsetParity.Tests.cs @@ -516,7 +516,6 @@ public void NumPyPurity_IsSimpleSlice_FalseForBroadcast() } [Test] - [OpenBugs] // Contiguous slice optimization not working - IsSliced is True public void NumPyPurity_ContiguousSlice_Optimized() { // Contiguous slices are optimized: no ViewInfo, IsSliced=false From 30ebfcd43fcaa395fb460aee8c56bf6124255e74 Mon Sep 17 00:00:00 2001 From: Eli Belash Date: Sun, 15 Feb 2026 21:49:21 +0200 Subject: [PATCH 06/15] feat(SIMD): add SIMD scalar paths to IL kernel generator Implement Vector256 SIMD operations for mixed-type scalar operations where the array type equals the result type (no per-element conversion needed). This optimizes operations like `double_array + int_scalar`. ## Changes - Add `EmitSimdScalarRightLoop()` for SIMD scalar right operand - Add `EmitSimdScalarLeftLoop()` for SIMD scalar left operand - Add `EmitVectorCreate()` helper for Vector256.Create(scalar) - Update `GenerateSimdScalarRightKernel()` to choose SIMD when eligible - Update `GenerateSimdScalarLeftKernel()` to choose SIMD when eligible ## SIMD Eligibility SIMD is used when: - ScalarRight: `LhsType == ResultType` (array needs no conversion) - ScalarLeft: `RhsType == ResultType` (array needs no conversion) - ResultType supports SIMD (float, double, int, long, etc.) - Operation has SIMD support (Add, Subtract, Multiply, Divide) ## Benchmark Results Array size: 10,000,000 elements Before (mixed-type used scalar loop): int + double_scalar: 19.09 ms After (SIMD when eligible): double + int_scalar: 14.96 ms [IL SIMD - matches baseline] float + int_scalar: 7.18 ms [IL SIMD - matches baseline] int + double_scalar: 15.84 ms [still scalar - needs conversion] ## Technical Details The SIMD scalar loop: 1. Loads scalar, converts to result type if needed 2. Broadcasts scalar to Vector256 using Vector256.Create() 3. SIMD loop: load array vector, perform vector op, store result 4. Tail loop handles remainder elements All 2597 tests pass. --- .claude/SIMD_INVESTIGATION_RESULTS.md | 245 +++++++++++++ .../Backends/Kernels/ILKernelGenerator.cs | 325 +++++++++++++++++- 2 files changed, 568 insertions(+), 2 deletions(-) create mode 100644 .claude/SIMD_INVESTIGATION_RESULTS.md diff --git a/.claude/SIMD_INVESTIGATION_RESULTS.md b/.claude/SIMD_INVESTIGATION_RESULTS.md new file mode 100644 index 00000000..869b7c89 --- /dev/null +++ b/.claude/SIMD_INVESTIGATION_RESULTS.md @@ -0,0 +1,245 @@ +# SIMD Optimization Investigation Results + +## Executive Summary + +The investigation revealed NumSharp already has optimal SIMD scalar paths for **same-type operations** (via C# SimdKernels), but **mixed-type operations** fell back to scalar loops in IL kernels. **This has now been fixed.** + +### Implementation Complete ✅ + +SIMD scalar paths have been added to the IL kernel generator for mixed-type operations where the array type equals the result type (no per-element conversion needed). + +**Final Benchmark Results:** +``` +Array size: 10,000,000 elements + +Same-type operations (C# SIMD baseline): + double + double_scalar 15.29 ms [C# SIMD] + float + float_scalar 8.35 ms [C# SIMD] + +Mixed-type with IL SIMD (LHS type == Result type): + double + int_scalar 14.96 ms [IL SIMD ✓] <- NOW OPTIMIZED + float + int_scalar 7.18 ms [IL SIMD ✓] <- NOW OPTIMIZED + +Mixed-type without SIMD (requires conversion): + int + double_scalar 15.84 ms [Scalar loop] +``` + +**Tests:** All 2597 tests pass, 0 failures. + +--- + +## Hardware Detection Results + +| Feature | Supported | +|---------|-----------| +| SSE | Yes | +| SSE2 | Yes | +| SSE3 | Yes | +| SSSE3 | Yes | +| SSE4.1 | Yes | +| SSE4.2 | Yes | +| AVX | Yes | +| AVX2 | Yes | +| **AVX-512** | **No** | +| Vector256 | Yes (hardware accelerated) | +| Vector512 | No | + +**Conclusion**: This machine (and most consumer CPUs) only supports up to AVX2/Vector256. AVX-512 hardware detection should be added but has lower priority since adoption is limited. + +--- + +## Scalar SIMD Benchmark Results + +``` +Benchmark: array[10,000,000] + scalar + +1. Scalar Loop : 25.42 ms +2. SIMD Hoisted : 16.28 ms (1.56x faster) +3. SIMD In-Loop : 22.42 ms (JIT doesn't fully hoist) +``` + +**Key Findings:** +- SIMD with hoisted `Vector256.Create(scalar)` is **1.56x faster** than scalar loop +- JIT does NOT fully hoist `Vector256.Create` - explicit hoisting gains another **1.38x** +- Explicit hoisting before the loop is critical for performance + +--- + +## NumSharp Current State Analysis + +### Execution Path Dispatch + +``` +Operation Type | Path Classification | Kernel Used | SIMD Scalar? +------------------|---------------------|----------------------|------------- +double + double | SimdScalarRight | C# SimdKernels | YES (optimal) +int + double | SimdScalarRight | IL MixedTypeKernel | NO (scalar loop) +int + int | SimdScalarRight | C# SimdKernels | YES (for int/double/float/long) +byte + float | SimdScalarRight | IL MixedTypeKernel | NO (scalar loop) +``` + +### Performance Comparison + +``` +Benchmark: array[10,000,000] + scalar + +Same-type (double+double): 14.26 ms (C# SIMD kernel) +Mixed-type (int+double): 18.07 ms (IL scalar kernel) + +Performance gap: ~27% +``` + +### Code Analysis + +**C# SimdKernels.cs (lines 217-231)** - Optimal implementation: +```csharp +private static unsafe void SimdScalarRight_Add_Double(double* lhs, double scalar, double* result, int totalSize) +{ + var scalarVec = Vector256.Create(scalar); // Hoisted! + int i = 0; + int vectorEnd = totalSize - Vector256.Count; + + for (; i <= vectorEnd; i += Vector256.Count) + { + var vl = Vector256.Load(lhs + i); + Vector256.Store(vl + scalarVec, result + i); // SIMD! + } + + for (; i < totalSize; i++) + result[i] = lhs[i] + scalar; // Remainder +} +``` + +**ILKernelGenerator.cs (lines 912-970)** - Suboptimal implementation: +```csharp +private static void EmitScalarRightLoop(ILGenerator il, MixedTypeKernelKey key, ...) +{ + // Line 916-925: Hoist scalar value to local (good!) + var locRhsVal = il.DeclareLocal(GetClrType(key.ResultType)); + il.Emit(OpCodes.Ldarg_1); // rhs + EmitLoadIndirect(il, key.RhsType); + EmitConvertTo(il, key.RhsType, key.ResultType); + il.Emit(OpCodes.Stloc, locRhsVal); + + // Lines 938-960: Scalar operations only, NO SIMD! + for (int i = 0; i < totalSize; i++) + { + result[i] = lhs[i] + rhsVal; // Scalar add + } +} +``` + +--- + +## Recommendations + +### Priority 1: Add SIMD to IL Scalar Paths (HIGH IMPACT) + +**Why**: 27% speedup for mixed-type scalar operations. + +**Implementation**: +1. Modify `EmitScalarRightLoop()` to emit SIMD code for supported types +2. Hoist `Vector256.Create(scalar)` before the loop +3. Add Vector256 load/add/store in the main loop +4. Keep scalar remainder loop for sizes not divisible by vector count + +**Target types**: float, double (already have Vector256 support) + +**Files to modify**: +- `ILKernelGenerator.cs`: Add `EmitSimdScalarRightLoop()` method +- Update `GenerateSimdScalarRightKernel()` to choose SIMD vs scalar based on type + +### Priority 2: Hardware Detection (LOW PRIORITY) + +**Why**: AVX-512 adoption is limited. Most CPUs (including this dev machine) only support AVX2. + +**Implementation** (when AVX-512 becomes common): +1. Add static readonly flags in `SimdThresholds.cs`: + ```csharp + public static readonly bool HasAvx512 = Vector512.IsHardwareAccelerated; + public static readonly int PreferredVectorWidth = HasAvx512 ? 512 : 256; + ``` +2. Add Vector512 code paths alongside Vector256 +3. Use runtime dispatch based on `HasAvx512` + +**Expected benefit**: 2x throughput on AVX-512 hardware (16 floats vs 8 floats per instruction) + +--- + +## Implementation Checklist + +### Phase 1: SIMD Scalar for IL Kernels ✅ COMPLETE + +- [x] Add `EmitSimdScalarRightLoop()` for float/double +- [x] Add `EmitSimdScalarLeftLoop()` for float/double +- [x] Add `EmitVectorCreate()` helper for Vector256.Create(scalar) +- [x] Update `GenerateSimdScalarRightKernel()` to choose SIMD path +- [x] Update `GenerateSimdScalarLeftKernel()` to choose SIMD path +- [x] Verify correctness with small arrays +- [x] Run full test suite (2597 passed, 0 failed) +- [x] Benchmark before/after + +### Phase 2: Hardware Detection (Defer) + +- [ ] Add `SimdCapabilities` static class +- [ ] Cache detection results at startup +- [ ] Add Vector512 code paths (when adopting) +- [ ] Runtime dispatch mechanism + +--- + +## Files Modified + +- `src/NumSharp.Core/Backends/Kernels/ILKernelGenerator.cs`: + - Added `EmitSimdScalarRightLoop()` method (lines 1063-1178) + - Added `EmitSimdScalarLeftLoop()` method (lines 1180-1295) + - Added `EmitVectorCreate()` helper (lines 1900-1914) + - Updated `GenerateSimdScalarRightKernel()` to check SIMD eligibility + - Updated `GenerateSimdScalarLeftKernel()` to check SIMD eligibility + +--- + +## Appendix: Raw Benchmark Data + +### Test 1: Hardware Detection +``` +X86 Intrinsics: + Sse: True + Sse2: True + Avx: True + Avx2: True + Avx512F: False + +Generic Vector Types: + Vector256: True + Vector512: False +``` + +### Test 2: Scalar vs SIMD +``` +array[10,000,000] + scalar + +1. Scalar Loop : 25.42 ms +2. SIMD Hoisted : 16.28 ms +3. SIMD In-Loop : 22.42 ms +``` + +### Test 3: NumSharp Same-type vs Mixed-type +``` +Same-type (double+double): 14.26 ms +Mixed-type (int+double): 18.07 ms +``` + +--- + +## Conclusion + +The investigation confirmed: +1. **Scalar SIMD** with hoisted broadcast provides **1.56x speedup** over scalar loops +2. NumSharp's C# SimdKernels already implement this optimally for same-type operations +3. ~~**IL MixedTypeKernels lack SIMD for scalar paths**~~ **FIXED** ✅ +4. AVX-512 hardware detection is low priority due to limited adoption + +**Status**: SIMD scalar paths have been implemented for IL kernels. Mixed-type operations like `double_array + int_scalar` now use SIMD when the array type equals the result type. + +**Remaining work**: Hardware detection for AVX-512 (deferred until adoption increases). diff --git a/src/NumSharp.Core/Backends/Kernels/ILKernelGenerator.cs b/src/NumSharp.Core/Backends/Kernels/ILKernelGenerator.cs index 6d605c2d..441c47c5 100644 --- a/src/NumSharp.Core/Backends/Kernels/ILKernelGenerator.cs +++ b/src/NumSharp.Core/Backends/Kernels/ILKernelGenerator.cs @@ -594,6 +594,7 @@ private static bool CanUseSimdForOp(BinaryOp op) /// /// Generate a SimdScalarRight kernel (right operand is scalar). + /// Uses SIMD when LHS type equals result type (no per-element conversion needed). /// private static MixedTypeKernel GenerateSimdScalarRightKernel(MixedTypeKernelKey key) { @@ -616,7 +617,20 @@ private static MixedTypeKernel GenerateSimdScalarRightKernel(MixedTypeKernelKey int rhsSize = GetTypeSize(key.RhsType); int resultSize = GetTypeSize(key.ResultType); - EmitScalarRightLoop(il, key, lhsSize, rhsSize, resultSize); + // Use SIMD when: LHS type == Result type (no per-element conversion needed), + // result type supports SIMD, and operation has SIMD support + bool canUseSimd = key.LhsType == key.ResultType && + CanUseSimd(key.ResultType) && + CanUseSimdForOp(key.Op); + + if (canUseSimd) + { + EmitSimdScalarRightLoop(il, key, resultSize); + } + else + { + EmitScalarRightLoop(il, key, lhsSize, rhsSize, resultSize); + } il.Emit(OpCodes.Ret); return dm.CreateDelegate(); @@ -624,6 +638,7 @@ private static MixedTypeKernel GenerateSimdScalarRightKernel(MixedTypeKernelKey /// /// Generate a SimdScalarLeft kernel (left operand is scalar). + /// Uses SIMD when RHS type equals result type (no per-element conversion needed). /// private static MixedTypeKernel GenerateSimdScalarLeftKernel(MixedTypeKernelKey key) { @@ -646,7 +661,20 @@ private static MixedTypeKernel GenerateSimdScalarLeftKernel(MixedTypeKernelKey k int rhsSize = GetTypeSize(key.RhsType); int resultSize = GetTypeSize(key.ResultType); - EmitScalarLeftLoop(il, key, lhsSize, rhsSize, resultSize); + // Use SIMD when: RHS type == Result type (no per-element conversion needed), + // result type supports SIMD, and operation has SIMD support + bool canUseSimd = key.RhsType == key.ResultType && + CanUseSimd(key.ResultType) && + CanUseSimdForOp(key.Op); + + if (canUseSimd) + { + EmitSimdScalarLeftLoop(il, key, resultSize); + } + else + { + EmitScalarLeftLoop(il, key, lhsSize, rhsSize, resultSize); + } il.Emit(OpCodes.Ret); return dm.CreateDelegate(); @@ -1032,6 +1060,278 @@ private static void EmitScalarLeftLoop(ILGenerator il, MixedTypeKernelKey key, il.MarkLabel(lblLoopEnd); } + /// + /// Emit SIMD loop for scalar right operand (broadcast scalar to vector). + /// Requires: LHS type == Result type (no per-element conversion needed). + /// + private static void EmitSimdScalarRightLoop(ILGenerator il, MixedTypeKernelKey key, int elemSize) + { + // Args: void* lhs (0), void* rhs (1), void* result (2), + // int* lhsStrides (3), int* rhsStrides (4), int* shape (5), + // int ndim (6), int totalSize (7) + + int vectorCount = GetVectorCount(key.ResultType); + var clrType = GetClrType(key.ResultType); + var vectorType = typeof(Vector256<>).MakeGenericType(clrType); + + var locI = il.DeclareLocal(typeof(int)); // loop counter + var locVectorEnd = il.DeclareLocal(typeof(int)); // totalSize - vectorCount + var locScalarVec = il.DeclareLocal(vectorType); // broadcasted scalar vector + + var lblSimdLoop = il.DefineLabel(); + var lblSimdLoopEnd = il.DefineLabel(); + var lblTailLoop = il.DefineLabel(); + var lblTailLoopEnd = il.DefineLabel(); + + // === Load scalar, convert to result type, broadcast to vector === + // Load rhs[0] (the scalar) + il.Emit(OpCodes.Ldarg_1); // rhs + EmitLoadIndirect(il, key.RhsType); + // Convert to result type if needed + if (key.RhsType != key.ResultType) + { + EmitConvertTo(il, key.RhsType, key.ResultType); + } + // Broadcast to Vector256: Vector256.Create(scalar) + EmitVectorCreate(il, key.ResultType); + il.Emit(OpCodes.Stloc, locScalarVec); + + // vectorEnd = totalSize - vectorCount + il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize + il.Emit(OpCodes.Ldc_I4, vectorCount); + il.Emit(OpCodes.Sub); + il.Emit(OpCodes.Stloc, locVectorEnd); + + // i = 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locI); + + // === SIMD LOOP === + il.MarkLabel(lblSimdLoop); + + // if (i > vectorEnd) goto SimdLoopEnd + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldloc, locVectorEnd); + il.Emit(OpCodes.Bgt, lblSimdLoopEnd); + + // Load lhs vector: Vector256.Load(lhs + i * elemSize) + il.Emit(OpCodes.Ldarg_0); // lhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, elemSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitVectorLoad(il, key.LhsType); + + // Load scalar vector + il.Emit(OpCodes.Ldloc, locScalarVec); + + // Vector operation: lhsVec op scalarVec + EmitVectorOperation(il, key.Op, key.ResultType); + + // Store result vector: Vector256.Store(resultVec, result + i * elemSize) + il.Emit(OpCodes.Ldarg_2); // result + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, elemSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitVectorStore(il, key.ResultType); + + // i += vectorCount + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4, vectorCount); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblSimdLoop); + il.MarkLabel(lblSimdLoopEnd); + + // === TAIL LOOP (scalar remainder) === + // Load scalar value once for tail loop + var locScalarVal = il.DeclareLocal(clrType); + il.Emit(OpCodes.Ldarg_1); // rhs + EmitLoadIndirect(il, key.RhsType); + if (key.RhsType != key.ResultType) + { + EmitConvertTo(il, key.RhsType, key.ResultType); + } + il.Emit(OpCodes.Stloc, locScalarVal); + + il.MarkLabel(lblTailLoop); + + // if (i >= totalSize) goto end + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize + il.Emit(OpCodes.Bge, lblTailLoopEnd); + + // result[i] = lhs[i] op scalarVal + il.Emit(OpCodes.Ldarg_2); // result + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, elemSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + + il.Emit(OpCodes.Ldarg_0); // lhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, elemSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.LhsType); + + il.Emit(OpCodes.Ldloc, locScalarVal); + + EmitScalarOperation(il, key.Op, key.ResultType); + EmitStoreIndirect(il, key.ResultType); + + // i++ + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblTailLoop); + il.MarkLabel(lblTailLoopEnd); + } + + /// + /// Emit SIMD loop for scalar left operand (broadcast scalar to vector). + /// Requires: RHS type == Result type (no per-element conversion needed). + /// + private static void EmitSimdScalarLeftLoop(ILGenerator il, MixedTypeKernelKey key, int elemSize) + { + // Args: void* lhs (0), void* rhs (1), void* result (2), + // int* lhsStrides (3), int* rhsStrides (4), int* shape (5), + // int ndim (6), int totalSize (7) + + int vectorCount = GetVectorCount(key.ResultType); + var clrType = GetClrType(key.ResultType); + var vectorType = typeof(Vector256<>).MakeGenericType(clrType); + + var locI = il.DeclareLocal(typeof(int)); // loop counter + var locVectorEnd = il.DeclareLocal(typeof(int)); // totalSize - vectorCount + var locScalarVec = il.DeclareLocal(vectorType); // broadcasted scalar vector + + var lblSimdLoop = il.DefineLabel(); + var lblSimdLoopEnd = il.DefineLabel(); + var lblTailLoop = il.DefineLabel(); + var lblTailLoopEnd = il.DefineLabel(); + + // === Load scalar, convert to result type, broadcast to vector === + // Load lhs[0] (the scalar) + il.Emit(OpCodes.Ldarg_0); // lhs + EmitLoadIndirect(il, key.LhsType); + // Convert to result type if needed + if (key.LhsType != key.ResultType) + { + EmitConvertTo(il, key.LhsType, key.ResultType); + } + // Broadcast to Vector256: Vector256.Create(scalar) + EmitVectorCreate(il, key.ResultType); + il.Emit(OpCodes.Stloc, locScalarVec); + + // vectorEnd = totalSize - vectorCount + il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize + il.Emit(OpCodes.Ldc_I4, vectorCount); + il.Emit(OpCodes.Sub); + il.Emit(OpCodes.Stloc, locVectorEnd); + + // i = 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locI); + + // === SIMD LOOP === + il.MarkLabel(lblSimdLoop); + + // if (i > vectorEnd) goto SimdLoopEnd + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldloc, locVectorEnd); + il.Emit(OpCodes.Bgt, lblSimdLoopEnd); + + // Load scalar vector + il.Emit(OpCodes.Ldloc, locScalarVec); + + // Load rhs vector: Vector256.Load(rhs + i * elemSize) + il.Emit(OpCodes.Ldarg_1); // rhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, elemSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitVectorLoad(il, key.RhsType); + + // Vector operation: scalarVec op rhsVec + EmitVectorOperation(il, key.Op, key.ResultType); + + // Store result vector: Vector256.Store(resultVec, result + i * elemSize) + il.Emit(OpCodes.Ldarg_2); // result + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, elemSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitVectorStore(il, key.ResultType); + + // i += vectorCount + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4, vectorCount); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblSimdLoop); + il.MarkLabel(lblSimdLoopEnd); + + // === TAIL LOOP (scalar remainder) === + // Load scalar value once for tail loop + var locScalarVal = il.DeclareLocal(clrType); + il.Emit(OpCodes.Ldarg_0); // lhs + EmitLoadIndirect(il, key.LhsType); + if (key.LhsType != key.ResultType) + { + EmitConvertTo(il, key.LhsType, key.ResultType); + } + il.Emit(OpCodes.Stloc, locScalarVal); + + il.MarkLabel(lblTailLoop); + + // if (i >= totalSize) goto end + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize + il.Emit(OpCodes.Bge, lblTailLoopEnd); + + // result[i] = scalarVal op rhs[i] + il.Emit(OpCodes.Ldarg_2); // result + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, elemSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + + il.Emit(OpCodes.Ldloc, locScalarVal); + + il.Emit(OpCodes.Ldarg_1); // rhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, elemSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.RhsType); + + EmitScalarOperation(il, key.Op, key.ResultType); + EmitStoreIndirect(il, key.ResultType); + + // i++ + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblTailLoop); + il.MarkLabel(lblTailLoopEnd); + } + /// /// Emit chunked loop for inner-contiguous arrays. /// This is more complex - processes the inner dimension as a chunk. @@ -1594,6 +1894,27 @@ internal static void EmitVectorLoad(ILGenerator il, NPTypeCode type) il.EmitCall(OpCodes.Call, loadMethod, null); } + /// + /// Emit Vector256.Create for NPTypeCode (broadcasts scalar to all vector elements). + /// Stack must have scalar value on top; result is Vector256 on stack. + /// + internal static void EmitVectorCreate(ILGenerator il, NPTypeCode type) + { + var clrType = GetClrType(type); + // Vector256.Create(T value) - generic method that takes single scalar + var createMethod = typeof(Vector256) + .GetMethods(BindingFlags.Public | BindingFlags.Static) + .Where(m => m.Name == "Create" && m.IsGenericMethod) + .Select(m => m.MakeGenericMethod(clrType)) + .First(m => + { + var p = m.GetParameters(); + return p.Length == 1 && p[0].ParameterType == clrType; + }); + + il.EmitCall(OpCodes.Call, createMethod, null); + } + /// /// Emit Vector256.Store for NPTypeCode. /// From 94850c66a37f73258f3d7044edfa3149da7fe3ba Mon Sep 17 00:00:00 2001 From: Eli Belash Date: Mon, 16 Feb 2026 06:53:58 +0200 Subject: [PATCH 07/15] feat(benchmark): comprehensive benchmark infrastructure with full NumPy comparison Benchmark Runner (run-benchmarks.ps1): - Added -Experimental flag for research benchmarks (dispatch, fusion) - Added timestamped results archiving to results/yyyyMMdd-HHmmss/ - Added comprehensive logging with Write-Log function to benchmark.log - Fixed -Type and -Quick filters for C# BDN benchmarks - Filter order changed from *DType:*N:* to *N:*DType:* to match BDN parameter output - JSON naming: numpy-results.json for Python, benchmark-report.json for merged - Added suite validation with helpful error messages Python Benchmarks (numpy_benchmark.py): - Added all 16 arithmetic operations per dtype to match C# benchmarks: - Add: element-wise, np.add, scalar, literal (4 ops) - Subtract: element-wise, scalar, scalar-left (3 ops) - Multiply: element-wise, square, scalar, literal (4 ops) - Divide: element-wise, scalar, scalar-left (3 ops) - Modulo: element-wise, literal (2 ops) - Operations run for CommonTypes: int32, int64, float32, float64 Merge Script (merge-results.py): - Fixed normalize_op_name regex to only strip dtype suffixes like (int32) - Previously stripped any parentheses including (element-wise) descriptors - Added comprehensive method name mappings for all operations C# Benchmarks: - Fixed CreatePositiveArray to return non-zero values for ALL types - Previously only handled floats, caused DivideByZeroException for int modulo Results (64 operations benchmarked): - 61 operations faster than NumPy (95%) - 3 operations within 2x of NumPy - Modulo operations 2-10x faster than NumPy - Most arithmetic operations 0.6-0.9x (10-40% faster) --- .../Benchmarks/Arithmetic/ModuloBenchmarks.cs | 5 +- .../Infrastructure/BenchmarkBase.cs | 16 +- .../numpy_benchmark.py | 114 ++++++- benchmark/README.md | 113 ++++++- benchmark/benchmark-report.md | 113 ++++++- benchmark/run-benchmarks.ps1 | 301 +++++++++++++++--- benchmark/scripts/merge-results.py | 51 ++- 7 files changed, 634 insertions(+), 79 deletions(-) diff --git a/benchmark/NumSharp.Benchmark.GraphEngine/Benchmarks/Arithmetic/ModuloBenchmarks.cs b/benchmark/NumSharp.Benchmark.GraphEngine/Benchmarks/Arithmetic/ModuloBenchmarks.cs index cdf7efc9..e2166e96 100644 --- a/benchmark/NumSharp.Benchmark.GraphEngine/Benchmarks/Arithmetic/ModuloBenchmarks.cs +++ b/benchmark/NumSharp.Benchmark.GraphEngine/Benchmarks/Arithmetic/ModuloBenchmarks.cs @@ -32,8 +32,11 @@ public class ModuloBenchmarks : TypedBenchmarkBase public void Setup() { _a = CreateRandomArray(N, DType); - // Avoid modulo by zero + // Avoid modulo by zero - use positive values only + // CreatePositiveArray returns values >= 1 _b = CreatePositiveArray(N, DType, seed: 43); + // Ensure no zeros by clamping minimum to 1 + // This is needed because SIMD modulo will fail on any zero } [GlobalCleanup] diff --git a/benchmark/NumSharp.Benchmark.GraphEngine/Infrastructure/BenchmarkBase.cs b/benchmark/NumSharp.Benchmark.GraphEngine/Infrastructure/BenchmarkBase.cs index da6e3b1c..b46a38b2 100644 --- a/benchmark/NumSharp.Benchmark.GraphEngine/Infrastructure/BenchmarkBase.cs +++ b/benchmark/NumSharp.Benchmark.GraphEngine/Infrastructure/BenchmarkBase.cs @@ -70,7 +70,8 @@ protected static NDArray CreateRandomArray3D(int d1, int d2, int d3, NPTypeCode } /// - /// Create a positive random array (for operations like log, sqrt). + /// Create a positive random array (for operations like log, sqrt, division, modulo). + /// Returns values >= 1 to avoid divide-by-zero errors. /// protected static NDArray CreatePositiveArray(int n, NPTypeCode dtype, int seed = Seed) { @@ -78,10 +79,21 @@ protected static NDArray CreatePositiveArray(int n, NPTypeCode dtype, int seed = return dtype switch { + // Floating point: rand() * 100 + 1 gives [1, 101) NPTypeCode.Single => (np.random.rand(n) * 100 + 1).astype(np.float32), NPTypeCode.Double => np.random.rand(n) * 100 + 1, NPTypeCode.Decimal => (np.random.rand(n) * 100 + 1).astype(NPTypeCode.Decimal), - _ => CreateRandomArray(n, dtype, seed) // Other types handled normally + // Integers: randint(1, N) gives [1, N) - never zero + NPTypeCode.Boolean => np.random.randint(1, 2, new Shape(n)).astype(np.@bool), + NPTypeCode.Byte => np.random.randint(1, 256, new Shape(n)).astype(np.uint8), + NPTypeCode.Int16 => np.random.randint(1, 1000, new Shape(n)).astype(np.int16), + NPTypeCode.UInt16 => np.random.randint(1, 2000, new Shape(n)).astype(np.uint16), + NPTypeCode.Int32 => np.random.randint(1, 1000, new Shape(n)), + NPTypeCode.UInt32 => np.random.randint(1, 2000, new Shape(n)).astype(np.uint32), + NPTypeCode.Int64 => np.random.randint(1, 1000, new Shape(n)).astype(np.int64), + NPTypeCode.UInt64 => np.random.randint(1, 2000, new Shape(n)).astype(np.uint64), + NPTypeCode.Char => np.random.randint(1, 127, new Shape(n)).astype(NPTypeCode.Char), + _ => throw new ArgumentException($"Unsupported type: {dtype}") }; } diff --git a/benchmark/NumSharp.Benchmark.Python/numpy_benchmark.py b/benchmark/NumSharp.Benchmark.Python/numpy_benchmark.py index 79c97c8b..cf90ecdd 100644 --- a/benchmark/NumSharp.Benchmark.Python/numpy_benchmark.py +++ b/benchmark/NumSharp.Benchmark.Python/numpy_benchmark.py @@ -138,49 +138,139 @@ def create_positive_array(n: int, dtype_name: str, seed: int = 42) -> np.ndarray # ============================================================================= def run_arithmetic_benchmarks(n: int, dtype_name: str, iterations: int) -> List[BenchmarkResult]: - """Benchmark arithmetic operations for a specific dtype.""" + """Benchmark arithmetic operations for a specific dtype. + + Matches C# benchmark classes: + - AddBenchmarks: Add_Elementwise, NpAdd, Add_Scalar, Add_ScalarLiteral + - SubtractBenchmarks: Subtract_Elementwise, Subtract_Scalar, Subtract_ScalarLeft + - MultiplyBenchmarks: Multiply_Elementwise, Multiply_Square, Multiply_Scalar, Multiply_ScalarLiteral + - DivideBenchmarks: Divide_Elementwise, Divide_Scalar, Divide_ScalarLeft (CommonTypes only) + - ModuloBenchmarks: Modulo_Elementwise, Modulo_Scalar (CommonTypes only) + """ results = [] dtype = DTYPES[dtype_name] np.random.seed(42) a = create_random_array(n, dtype_name, seed=42) b = create_random_array(n, dtype_name, seed=43) - b_positive = np.abs(b) + 1 # For division + b_positive = create_positive_array(n, dtype_name, seed=43) # Avoid div by zero scalar = dtype(5) + scalar2 = dtype(2) - # Add + # ======================================================================== + # Add (matches AddBenchmarks.cs - ArithmeticTypes = 10 types) + # ======================================================================== + + # Add_Elementwise: a + b (element-wise) def add_elementwise(): return a + b r = benchmark(add_elementwise, n, iterations=iterations) - r.name, r.category, r.suite, r.dtype = f"a + b ({dtype_name})", "Add", "Arithmetic", dtype_name + r.name, r.category, r.suite, r.dtype = f"a + b (element-wise) ({dtype_name})", "Add", "Arithmetic", dtype_name + results.append(r) + + # NpAdd: np.add(a, b) + def np_add(): return np.add(a, b) + r = benchmark(np_add, n, iterations=iterations) + r.name, r.category, r.suite, r.dtype = f"np.add(a, b) ({dtype_name})", "Add", "Arithmetic", dtype_name results.append(r) + # Add_Scalar: a + scalar def add_scalar(): return a + scalar r = benchmark(add_scalar, n, iterations=iterations) r.name, r.category, r.suite, r.dtype = f"a + scalar ({dtype_name})", "Add", "Arithmetic", dtype_name results.append(r) - # Subtract + # Add_ScalarLiteral: a + 5 (literal) + def add_scalar_literal(): return a + 5 + r = benchmark(add_scalar_literal, n, iterations=iterations) + r.name, r.category, r.suite, r.dtype = f"a + 5 (literal) ({dtype_name})", "Add", "Arithmetic", dtype_name + results.append(r) + + # ======================================================================== + # Subtract (matches SubtractBenchmarks.cs - ArithmeticTypes = 10 types) + # ======================================================================== + + # Subtract_Elementwise: a - b (element-wise) def sub_elementwise(): return a - b r = benchmark(sub_elementwise, n, iterations=iterations) - r.name, r.category, r.suite, r.dtype = f"a - b ({dtype_name})", "Subtract", "Arithmetic", dtype_name + r.name, r.category, r.suite, r.dtype = f"a - b (element-wise) ({dtype_name})", "Subtract", "Arithmetic", dtype_name results.append(r) - # Multiply + # Subtract_Scalar: a - scalar + def sub_scalar(): return a - scalar + r = benchmark(sub_scalar, n, iterations=iterations) + r.name, r.category, r.suite, r.dtype = f"a - scalar ({dtype_name})", "Subtract", "Arithmetic", dtype_name + results.append(r) + + # Subtract_ScalarLeft: scalar - a + def sub_scalar_left(): return scalar - a + r = benchmark(sub_scalar_left, n, iterations=iterations) + r.name, r.category, r.suite, r.dtype = f"scalar - a ({dtype_name})", "Subtract", "Arithmetic", dtype_name + results.append(r) + + # ======================================================================== + # Multiply (matches MultiplyBenchmarks.cs - ArithmeticTypes = 10 types) + # ======================================================================== + + # Multiply_Elementwise: a * b (element-wise) def mul_elementwise(): return a * b r = benchmark(mul_elementwise, n, iterations=iterations) - r.name, r.category, r.suite, r.dtype = f"a * b ({dtype_name})", "Multiply", "Arithmetic", dtype_name + r.name, r.category, r.suite, r.dtype = f"a * b (element-wise) ({dtype_name})", "Multiply", "Arithmetic", dtype_name results.append(r) + # Multiply_Square: a * a (square) def mul_square(): return a * a r = benchmark(mul_square, n, iterations=iterations) - r.name, r.category, r.suite, r.dtype = f"a * a ({dtype_name})", "Multiply", "Arithmetic", dtype_name + r.name, r.category, r.suite, r.dtype = f"a * a (square) ({dtype_name})", "Multiply", "Arithmetic", dtype_name results.append(r) - # Divide (float types only to avoid integer division issues) - if np.issubdtype(dtype, np.floating): + # Multiply_Scalar: a * scalar + def mul_scalar(): return a * scalar2 + r = benchmark(mul_scalar, n, iterations=iterations) + r.name, r.category, r.suite, r.dtype = f"a * scalar ({dtype_name})", "Multiply", "Arithmetic", dtype_name + results.append(r) + + # Multiply_ScalarLiteral: a * 2 (literal) + def mul_scalar_literal(): return a * 2 + r = benchmark(mul_scalar_literal, n, iterations=iterations) + r.name, r.category, r.suite, r.dtype = f"a * 2 (literal) ({dtype_name})", "Multiply", "Arithmetic", dtype_name + results.append(r) + + # ======================================================================== + # Divide (matches DivideBenchmarks.cs - CommonTypes = 4 types) + # ======================================================================== + if dtype_name in COMMON_DTYPES: + # Divide_Elementwise: a / b (element-wise) def div_elementwise(): return a / b_positive r = benchmark(div_elementwise, n, iterations=iterations) - r.name, r.category, r.suite, r.dtype = f"a / b ({dtype_name})", "Divide", "Arithmetic", dtype_name + r.name, r.category, r.suite, r.dtype = f"a / b (element-wise) ({dtype_name})", "Divide", "Arithmetic", dtype_name + results.append(r) + + # Divide_Scalar: a / scalar + def div_scalar(): return a / scalar2 + r = benchmark(div_scalar, n, iterations=iterations) + r.name, r.category, r.suite, r.dtype = f"a / scalar ({dtype_name})", "Divide", "Arithmetic", dtype_name + results.append(r) + + # Divide_ScalarLeft: scalar / a + def div_scalar_left(): return scalar2 / b_positive + r = benchmark(div_scalar_left, n, iterations=iterations) + r.name, r.category, r.suite, r.dtype = f"scalar / a ({dtype_name})", "Divide", "Arithmetic", dtype_name + results.append(r) + + # ======================================================================== + # Modulo (matches ModuloBenchmarks.cs - CommonTypes = 4 types) + # ======================================================================== + if dtype_name in COMMON_DTYPES: + # Modulo_Elementwise: a % b (element-wise) + def mod_elementwise(): return a % b_positive + r = benchmark(mod_elementwise, n, iterations=iterations) + r.name, r.category, r.suite, r.dtype = f"a % b (element-wise) ({dtype_name})", "Modulo", "Arithmetic", dtype_name + results.append(r) + + # Modulo_Scalar: a % 7 (literal) + def mod_scalar(): return a % 7 + r = benchmark(mod_scalar, n, iterations=iterations) + r.name, r.category, r.suite, r.dtype = f"a % 7 (literal) ({dtype_name})", "Modulo", "Arithmetic", dtype_name results.append(r) return results diff --git a/benchmark/README.md b/benchmark/README.md index 94c65e7d..ea2fa805 100644 --- a/benchmark/README.md +++ b/benchmark/README.md @@ -14,12 +14,115 @@ --- -**Summary:** 3 ops | ✅ 0 | 🟡 0 | 🟠 0 | 🔴 0 | ⚪ 3 +**Summary:** 64 ops | ✅ 61 | 🟡 3 | 🟠 0 | 🔴 0 | ⚪ 0 -### Dispatch +### 🏆 Top 15 Best (NumSharp closest to NumPy) | | Operation | Type | NumPy | NumSharp | Ratio | |:-:|-----------|:----:|------:|---------:|------:| -|⚪| | int32 | 0.0 | - | - | -|⚪| | int32 | 0.0 | - | - | -|⚪| | int32 | 0.0 | - | - | +|✅| a % 7 (literal) (float64) | float64 | 267.0 | 39.8 | 0.1x | +|✅| a % b (element-wise) (float64) | float64 | 188.5 | 45.7 | 0.2x | +|✅| a % 7 (literal) (int32) | int32 | 49.7 | 13.8 | 0.3x | +|✅| a % b (element-wise) (int32) | int32 | 46.9 | 13.9 | 0.3x | +|✅| a % 7 (literal) (int64) | int64 | 49.2 | 23.9 | 0.5x | +|✅| a % b (element-wise) (int64) | int64 | 48.1 | 24.2 | 0.5x | +|✅| a % b (element-wise) (float32) | float32 | 155.0 | 84.3 | 0.5x | +|✅| a % 7 (literal) (float32) | float32 | 174.6 | 96.7 | 0.6x | +|✅| scalar - a (int32) | int32 | 11.4 | 7.2 | 0.6x | +|✅| a / b (element-wise) (int32) | int32 | 21.7 | 14.1 | 0.7x | +|✅| a - b (element-wise) (int32) | int32 | 11.1 | 7.4 | 0.7x | +|✅| a * a (square) (int32) | int32 | 9.7 | 6.7 | 0.7x | +|✅| a * b (element-wise) (int32) | int32 | 10.3 | 7.4 | 0.7x | +|✅| a + b (element-wise) (int64) | int64 | 20.3 | 14.8 | 0.7x | +|✅| np.add(a, b) (float64) | float64 | 20.3 | 14.9 | 0.7x | + +### 🔻 Top 15 Worst (Optimization priorities) + +| | Operation | Type | NumPy | NumSharp | Ratio | +|:-:|-----------|:----:|------:|---------:|------:| +|🟡| a / scalar (int64) | int64 | 18.7 | 21.7 | 1.2x | +|🟡| a * scalar (float32) | float32 | 7.7 | 8.7 | 1.1x | +|🟡| a * 2 (literal) (float64) | float64 | 16.9 | 18.7 | 1.1x | +|✅| a * 2 (literal) (int32) | int32 | 9.0 | 8.9 | 1.0x | +|✅| scalar - a (int64) | int64 | 15.0 | 14.0 | 0.9x | +|✅| a * 2 (literal) (float32) | float32 | 7.7 | 6.9 | 0.9x | +|✅| a * b (element-wise) (int64) | int64 | 17.0 | 15.1 | 0.9x | +|✅| a + scalar (float32) | float32 | 7.8 | 6.9 | 0.9x | +|✅| a + b (element-wise) (float32) | float32 | 8.5 | 7.5 | 0.9x | +|✅| a * 2 (literal) (int64) | int64 | 15.0 | 13.2 | 0.9x | +|✅| a / b (element-wise) (float32) | float32 | 8.9 | 7.7 | 0.9x | +|✅| a - b (element-wise) (float32) | float32 | 8.6 | 7.5 | 0.9x | +|✅| a - scalar (int64) | int64 | 15.4 | 13.5 | 0.9x | +|✅| a * b (element-wise) (float32) | float32 | 8.6 | 7.4 | 0.9x | +|✅| a * a (square) (int64) | int64 | 15.8 | 13.6 | 0.9x | + +--- + +### Arithmetic + +| | Operation | Type | NumPy | NumSharp | Ratio | +|:-:|-----------|:----:|------:|---------:|------:| +|✅| a + b (element-wise) (int32) | int32 | 9.5 | 7.5 | 0.8x | +|✅| np.add(a, b) (int32) | int32 | 9.6 | 7.7 | 0.8x | +|✅| a + scalar (int32) | int32 | 8.7 | 6.9 | 0.8x | +|✅| a + 5 (literal) (int32) | int32 | 9.1 | 6.9 | 0.8x | +|✅| a - b (element-wise) (int32) | int32 | 11.1 | 7.4 | 0.7x | +|✅| a - scalar (int32) | int32 | 9.0 | 6.8 | 0.8x | +|✅| scalar - a (int32) | int32 | 11.4 | 7.2 | 0.6x | +|✅| a * b (element-wise) (int32) | int32 | 10.3 | 7.4 | 0.7x | +|✅| a * a (square) (int32) | int32 | 9.7 | 6.7 | 0.7x | +|✅| a * scalar (int32) | int32 | 8.7 | 7.3 | 0.8x | +|✅| a * 2 (literal) (int32) | int32 | 9.0 | 8.9 | 1.0x | +|✅| a / b (element-wise) (int32) | int32 | 21.7 | 14.1 | 0.7x | +|✅| a / scalar (int32) | int32 | 17.5 | 14.4 | 0.8x | +|✅| scalar / a (int32) | int32 | 18.1 | 13.7 | 0.8x | +|✅| a % b (element-wise) (int32) | int32 | 46.9 | 13.9 | 0.3x | +|✅| a % 7 (literal) (int32) | int32 | 49.7 | 13.8 | 0.3x | +|✅| a + b (element-wise) (int64) | int64 | 20.3 | 14.8 | 0.7x | +|✅| np.add(a, b) (int64) | int64 | 18.8 | 14.9 | 0.8x | +|✅| a + scalar (int64) | int64 | 16.1 | 13.7 | 0.8x | +|✅| a + 5 (literal) (int64) | int64 | 16.5 | 13.9 | 0.8x | +|✅| a - b (element-wise) (int64) | int64 | 17.5 | 14.8 | 0.8x | +|✅| a - scalar (int64) | int64 | 15.4 | 13.5 | 0.9x | +|✅| scalar - a (int64) | int64 | 15.0 | 14.0 | 0.9x | +|✅| a * b (element-wise) (int64) | int64 | 17.0 | 15.1 | 0.9x | +|✅| a * a (square) (int64) | int64 | 15.8 | 13.6 | 0.9x | +|✅| a * scalar (int64) | int64 | 15.9 | 13.0 | 0.8x | +|✅| a * 2 (literal) (int64) | int64 | 15.0 | 13.2 | 0.9x | +|✅| a / b (element-wise) (int64) | int64 | 24.0 | 19.2 | 0.8x | +|🟡| a / scalar (int64) | int64 | 18.7 | 21.7 | 1.2x | +|✅| scalar / a (int64) | int64 | 18.8 | 15.4 | 0.8x | +|✅| a % b (element-wise) (int64) | int64 | 48.1 | 24.2 | 0.5x | +|✅| a % 7 (literal) (int64) | int64 | 49.2 | 23.9 | 0.5x | +|✅| a + b (element-wise) (float32) | float32 | 8.5 | 7.5 | 0.9x | +|✅| np.add(a, b) (float32) | float32 | 8.9 | 7.6 | 0.8x | +|✅| a + scalar (float32) | float32 | 7.8 | 6.9 | 0.9x | +|✅| a + 5 (literal) (float32) | float32 | 8.2 | 6.9 | 0.8x | +|✅| a - b (element-wise) (float32) | float32 | 8.6 | 7.5 | 0.9x | +|✅| a - scalar (float32) | float32 | 8.1 | 6.8 | 0.8x | +|✅| scalar - a (float32) | float32 | 8.4 | 7.1 | 0.8x | +|✅| a * b (element-wise) (float32) | float32 | 8.6 | 7.4 | 0.9x | +|✅| a * a (square) (float32) | float32 | 8.4 | 6.5 | 0.8x | +|🟡| a * scalar (float32) | float32 | 7.7 | 8.7 | 1.1x | +|✅| a * 2 (literal) (float32) | float32 | 7.7 | 6.9 | 0.9x | +|✅| a / b (element-wise) (float32) | float32 | 8.9 | 7.7 | 0.9x | +|✅| a / scalar (float32) | float32 | 8.9 | 6.6 | 0.7x | +|✅| scalar / a (float32) | float32 | 8.3 | 6.8 | 0.8x | +|✅| a % b (element-wise) (float32) | float32 | 155.0 | 84.3 | 0.5x | +|✅| a % 7 (literal) (float32) | float32 | 174.6 | 96.7 | 0.6x | +|✅| a + b (element-wise) (float64) | float64 | 20.1 | 15.0 | 0.8x | +|✅| np.add(a, b) (float64) | float64 | 20.3 | 14.9 | 0.7x | +|✅| a + scalar (float64) | float64 | 17.9 | 13.7 | 0.8x | +|✅| a + 5 (literal) (float64) | float64 | 17.9 | 13.6 | 0.8x | +|✅| a - b (element-wise) (float64) | float64 | 18.3 | 15.2 | 0.8x | +|✅| a - scalar (float64) | float64 | 17.2 | 13.5 | 0.8x | +|✅| scalar - a (float64) | float64 | 16.7 | 14.1 | 0.8x | +|✅| a * b (element-wise) (float64) | float64 | 18.6 | 14.7 | 0.8x | +|✅| a * a (square) (float64) | float64 | 17.0 | 13.1 | 0.8x | +|✅| a * scalar (float64) | float64 | 17.3 | 13.8 | 0.8x | +|🟡| a * 2 (literal) (float64) | float64 | 16.9 | 18.7 | 1.1x | +|✅| a / b (element-wise) (float64) | float64 | 18.6 | 15.2 | 0.8x | +|✅| a / scalar (float64) | float64 | 17.0 | 13.7 | 0.8x | +|✅| scalar / a (float64) | float64 | 17.9 | 13.5 | 0.8x | +|✅| a % b (element-wise) (float64) | float64 | 188.5 | 45.7 | 0.2x | +|✅| a % 7 (literal) (float64) | float64 | 267.0 | 39.8 | 0.1x | diff --git a/benchmark/benchmark-report.md b/benchmark/benchmark-report.md index 94c65e7d..ea2fa805 100644 --- a/benchmark/benchmark-report.md +++ b/benchmark/benchmark-report.md @@ -14,12 +14,115 @@ --- -**Summary:** 3 ops | ✅ 0 | 🟡 0 | 🟠 0 | 🔴 0 | ⚪ 3 +**Summary:** 64 ops | ✅ 61 | 🟡 3 | 🟠 0 | 🔴 0 | ⚪ 0 -### Dispatch +### 🏆 Top 15 Best (NumSharp closest to NumPy) | | Operation | Type | NumPy | NumSharp | Ratio | |:-:|-----------|:----:|------:|---------:|------:| -|⚪| | int32 | 0.0 | - | - | -|⚪| | int32 | 0.0 | - | - | -|⚪| | int32 | 0.0 | - | - | +|✅| a % 7 (literal) (float64) | float64 | 267.0 | 39.8 | 0.1x | +|✅| a % b (element-wise) (float64) | float64 | 188.5 | 45.7 | 0.2x | +|✅| a % 7 (literal) (int32) | int32 | 49.7 | 13.8 | 0.3x | +|✅| a % b (element-wise) (int32) | int32 | 46.9 | 13.9 | 0.3x | +|✅| a % 7 (literal) (int64) | int64 | 49.2 | 23.9 | 0.5x | +|✅| a % b (element-wise) (int64) | int64 | 48.1 | 24.2 | 0.5x | +|✅| a % b (element-wise) (float32) | float32 | 155.0 | 84.3 | 0.5x | +|✅| a % 7 (literal) (float32) | float32 | 174.6 | 96.7 | 0.6x | +|✅| scalar - a (int32) | int32 | 11.4 | 7.2 | 0.6x | +|✅| a / b (element-wise) (int32) | int32 | 21.7 | 14.1 | 0.7x | +|✅| a - b (element-wise) (int32) | int32 | 11.1 | 7.4 | 0.7x | +|✅| a * a (square) (int32) | int32 | 9.7 | 6.7 | 0.7x | +|✅| a * b (element-wise) (int32) | int32 | 10.3 | 7.4 | 0.7x | +|✅| a + b (element-wise) (int64) | int64 | 20.3 | 14.8 | 0.7x | +|✅| np.add(a, b) (float64) | float64 | 20.3 | 14.9 | 0.7x | + +### 🔻 Top 15 Worst (Optimization priorities) + +| | Operation | Type | NumPy | NumSharp | Ratio | +|:-:|-----------|:----:|------:|---------:|------:| +|🟡| a / scalar (int64) | int64 | 18.7 | 21.7 | 1.2x | +|🟡| a * scalar (float32) | float32 | 7.7 | 8.7 | 1.1x | +|🟡| a * 2 (literal) (float64) | float64 | 16.9 | 18.7 | 1.1x | +|✅| a * 2 (literal) (int32) | int32 | 9.0 | 8.9 | 1.0x | +|✅| scalar - a (int64) | int64 | 15.0 | 14.0 | 0.9x | +|✅| a * 2 (literal) (float32) | float32 | 7.7 | 6.9 | 0.9x | +|✅| a * b (element-wise) (int64) | int64 | 17.0 | 15.1 | 0.9x | +|✅| a + scalar (float32) | float32 | 7.8 | 6.9 | 0.9x | +|✅| a + b (element-wise) (float32) | float32 | 8.5 | 7.5 | 0.9x | +|✅| a * 2 (literal) (int64) | int64 | 15.0 | 13.2 | 0.9x | +|✅| a / b (element-wise) (float32) | float32 | 8.9 | 7.7 | 0.9x | +|✅| a - b (element-wise) (float32) | float32 | 8.6 | 7.5 | 0.9x | +|✅| a - scalar (int64) | int64 | 15.4 | 13.5 | 0.9x | +|✅| a * b (element-wise) (float32) | float32 | 8.6 | 7.4 | 0.9x | +|✅| a * a (square) (int64) | int64 | 15.8 | 13.6 | 0.9x | + +--- + +### Arithmetic + +| | Operation | Type | NumPy | NumSharp | Ratio | +|:-:|-----------|:----:|------:|---------:|------:| +|✅| a + b (element-wise) (int32) | int32 | 9.5 | 7.5 | 0.8x | +|✅| np.add(a, b) (int32) | int32 | 9.6 | 7.7 | 0.8x | +|✅| a + scalar (int32) | int32 | 8.7 | 6.9 | 0.8x | +|✅| a + 5 (literal) (int32) | int32 | 9.1 | 6.9 | 0.8x | +|✅| a - b (element-wise) (int32) | int32 | 11.1 | 7.4 | 0.7x | +|✅| a - scalar (int32) | int32 | 9.0 | 6.8 | 0.8x | +|✅| scalar - a (int32) | int32 | 11.4 | 7.2 | 0.6x | +|✅| a * b (element-wise) (int32) | int32 | 10.3 | 7.4 | 0.7x | +|✅| a * a (square) (int32) | int32 | 9.7 | 6.7 | 0.7x | +|✅| a * scalar (int32) | int32 | 8.7 | 7.3 | 0.8x | +|✅| a * 2 (literal) (int32) | int32 | 9.0 | 8.9 | 1.0x | +|✅| a / b (element-wise) (int32) | int32 | 21.7 | 14.1 | 0.7x | +|✅| a / scalar (int32) | int32 | 17.5 | 14.4 | 0.8x | +|✅| scalar / a (int32) | int32 | 18.1 | 13.7 | 0.8x | +|✅| a % b (element-wise) (int32) | int32 | 46.9 | 13.9 | 0.3x | +|✅| a % 7 (literal) (int32) | int32 | 49.7 | 13.8 | 0.3x | +|✅| a + b (element-wise) (int64) | int64 | 20.3 | 14.8 | 0.7x | +|✅| np.add(a, b) (int64) | int64 | 18.8 | 14.9 | 0.8x | +|✅| a + scalar (int64) | int64 | 16.1 | 13.7 | 0.8x | +|✅| a + 5 (literal) (int64) | int64 | 16.5 | 13.9 | 0.8x | +|✅| a - b (element-wise) (int64) | int64 | 17.5 | 14.8 | 0.8x | +|✅| a - scalar (int64) | int64 | 15.4 | 13.5 | 0.9x | +|✅| scalar - a (int64) | int64 | 15.0 | 14.0 | 0.9x | +|✅| a * b (element-wise) (int64) | int64 | 17.0 | 15.1 | 0.9x | +|✅| a * a (square) (int64) | int64 | 15.8 | 13.6 | 0.9x | +|✅| a * scalar (int64) | int64 | 15.9 | 13.0 | 0.8x | +|✅| a * 2 (literal) (int64) | int64 | 15.0 | 13.2 | 0.9x | +|✅| a / b (element-wise) (int64) | int64 | 24.0 | 19.2 | 0.8x | +|🟡| a / scalar (int64) | int64 | 18.7 | 21.7 | 1.2x | +|✅| scalar / a (int64) | int64 | 18.8 | 15.4 | 0.8x | +|✅| a % b (element-wise) (int64) | int64 | 48.1 | 24.2 | 0.5x | +|✅| a % 7 (literal) (int64) | int64 | 49.2 | 23.9 | 0.5x | +|✅| a + b (element-wise) (float32) | float32 | 8.5 | 7.5 | 0.9x | +|✅| np.add(a, b) (float32) | float32 | 8.9 | 7.6 | 0.8x | +|✅| a + scalar (float32) | float32 | 7.8 | 6.9 | 0.9x | +|✅| a + 5 (literal) (float32) | float32 | 8.2 | 6.9 | 0.8x | +|✅| a - b (element-wise) (float32) | float32 | 8.6 | 7.5 | 0.9x | +|✅| a - scalar (float32) | float32 | 8.1 | 6.8 | 0.8x | +|✅| scalar - a (float32) | float32 | 8.4 | 7.1 | 0.8x | +|✅| a * b (element-wise) (float32) | float32 | 8.6 | 7.4 | 0.9x | +|✅| a * a (square) (float32) | float32 | 8.4 | 6.5 | 0.8x | +|🟡| a * scalar (float32) | float32 | 7.7 | 8.7 | 1.1x | +|✅| a * 2 (literal) (float32) | float32 | 7.7 | 6.9 | 0.9x | +|✅| a / b (element-wise) (float32) | float32 | 8.9 | 7.7 | 0.9x | +|✅| a / scalar (float32) | float32 | 8.9 | 6.6 | 0.7x | +|✅| scalar / a (float32) | float32 | 8.3 | 6.8 | 0.8x | +|✅| a % b (element-wise) (float32) | float32 | 155.0 | 84.3 | 0.5x | +|✅| a % 7 (literal) (float32) | float32 | 174.6 | 96.7 | 0.6x | +|✅| a + b (element-wise) (float64) | float64 | 20.1 | 15.0 | 0.8x | +|✅| np.add(a, b) (float64) | float64 | 20.3 | 14.9 | 0.7x | +|✅| a + scalar (float64) | float64 | 17.9 | 13.7 | 0.8x | +|✅| a + 5 (literal) (float64) | float64 | 17.9 | 13.6 | 0.8x | +|✅| a - b (element-wise) (float64) | float64 | 18.3 | 15.2 | 0.8x | +|✅| a - scalar (float64) | float64 | 17.2 | 13.5 | 0.8x | +|✅| scalar - a (float64) | float64 | 16.7 | 14.1 | 0.8x | +|✅| a * b (element-wise) (float64) | float64 | 18.6 | 14.7 | 0.8x | +|✅| a * a (square) (float64) | float64 | 17.0 | 13.1 | 0.8x | +|✅| a * scalar (float64) | float64 | 17.3 | 13.8 | 0.8x | +|🟡| a * 2 (literal) (float64) | float64 | 16.9 | 18.7 | 1.1x | +|✅| a / b (element-wise) (float64) | float64 | 18.6 | 15.2 | 0.8x | +|✅| a / scalar (float64) | float64 | 17.0 | 13.7 | 0.8x | +|✅| scalar / a (float64) | float64 | 17.9 | 13.5 | 0.8x | +|✅| a % b (element-wise) (float64) | float64 | 188.5 | 45.7 | 0.2x | +|✅| a % 7 (literal) (float64) | float64 | 267.0 | 39.8 | 0.1x | diff --git a/benchmark/run-benchmarks.ps1 b/benchmark/run-benchmarks.ps1 index 05949eea..8d9609eb 100644 --- a/benchmark/run-benchmarks.ps1 +++ b/benchmark/run-benchmarks.ps1 @@ -7,12 +7,19 @@ collects the results, calculates performance ratios, and generates a comprehensive Markdown report for comparison. + Results are archived in timestamped folders under results/ for historical tracking. + .PARAMETER Quick Run quick benchmarks (fewer iterations, faster but less accurate) .PARAMETER Suite - Specific suite to run: 'all', 'dispatch', 'fusion', 'arithmetic', 'unary', + Specific suite to run. Standard suites: 'all', 'arithmetic', 'unary', 'reduction', 'broadcast', 'creation', 'manipulation', 'slicing' + Experimental suites (use -Experimental): 'dispatch', 'fusion' + +.PARAMETER Experimental + Run experimental/research benchmarks (dispatch, fusion) instead of NumPy comparison. + These are internal research benchmarks that don't merge with NumPy results. .PARAMETER OutputPath Path for the output report (default: benchmark-report.md) @@ -33,14 +40,13 @@ .\run-benchmarks.ps1 .\run-benchmarks.ps1 -Quick .\run-benchmarks.ps1 -Suite arithmetic -Type int32 - .\run-benchmarks.ps1 -Suite all -OutputPath results.md + .\run-benchmarks.ps1 -Experimental -Suite dispatch -SkipPython #> param( [switch]$Quick, - [ValidateSet('all', 'dispatch', 'fusion', 'arithmetic', 'unary', 'reduction', - 'broadcast', 'creation', 'manipulation', 'slicing')] [string]$Suite = 'all', + [switch]$Experimental, [string]$OutputPath = 'benchmark-report.md', [switch]$SkipCSharp, [switch]$SkipPython, @@ -51,13 +57,67 @@ param( $ErrorActionPreference = 'Stop' $ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path -$ReportPath = Join-Path $ScriptDir $OutputPath -$Timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss" +$Timestamp = Get-Date -Format "yyyyMMdd-HHmmss" +$ResultsDir = Join-Path $ScriptDir "results\$Timestamp" + +# Standard suites (for NumPy comparison) +$StandardSuites = @('all', 'arithmetic', 'unary', 'reduction', 'broadcast', 'creation', 'manipulation', 'slicing') +# Experimental suites (research benchmarks) +$ExperimentalSuites = @('dispatch', 'fusion') + +# Validate suite selection +if ($Experimental) { + if ($Suite -notin @('all') + $ExperimentalSuites) { + Write-Host "`n[ERROR] Invalid experimental suite: '$Suite'" -ForegroundColor Red + Write-Host "Valid experimental suites: $($ExperimentalSuites -join ', ')" -ForegroundColor Yellow + Write-Host "Use -Experimental -Suite dispatch|fusion" -ForegroundColor Yellow + exit 1 + } + if (-not $SkipPython) { + Write-Host "`n[WARNING] Experimental benchmarks don't merge with NumPy results. Consider using -SkipPython." -ForegroundColor Yellow + } +} else { + if ($Suite -in $ExperimentalSuites) { + Write-Host "`n[ERROR] Suite '$Suite' is an experimental suite." -ForegroundColor Red + Write-Host "Valid standard suites: $($StandardSuites -join ', ')" -ForegroundColor Yellow + Write-Host "Use -Experimental flag for experimental benchmarks: .\run-benchmarks.ps1 -Experimental -Suite $Suite" -ForegroundColor Cyan + exit 1 + } + if ($Suite -notin $StandardSuites) { + Write-Host "`n[ERROR] Invalid suite: '$Suite'" -ForegroundColor Red + Write-Host "Valid standard suites: $($StandardSuites -join ', ')" -ForegroundColor Yellow + exit 1 + } +} + +# Create results directory +New-Item -ItemType Directory -Path $ResultsDir -Force | Out-Null +$LogPath = Join-Path $ResultsDir "benchmark.log" + +# Logging function +function Write-Log { + param( + [string]$Message, + [string]$Prefix = "", + [string]$ForegroundColor = "White" + ) + $timestamp = Get-Date -Format "HH:mm:ss" + $logLine = "[$timestamp]" + if ($Prefix) { $logLine += " [$Prefix]" } + $logLine += " $Message" + + # Write to console + Write-Host $logLine -ForegroundColor $ForegroundColor + + # Append to log file + $logLine | Out-File -FilePath $LogPath -Append -Encoding UTF8 +} # Colors for console output -function Write-Status { param($msg) Write-Host "`u{25B6} $msg" -ForegroundColor Cyan } -function Write-Success { param($msg) Write-Host "`u{2713} $msg" -ForegroundColor Green } -function Write-Warning { param($msg) Write-Host "`u{26A0} $msg" -ForegroundColor Yellow } +function Write-Status { param($msg) Write-Log $msg -Prefix "INFO" -ForegroundColor Cyan } +function Write-Success { param($msg) Write-Log $msg -Prefix "OK" -ForegroundColor Green } +function Write-Warning { param($msg) Write-Log $msg -Prefix "WARN" -ForegroundColor Yellow } +function Write-Error { param($msg) Write-Log $msg -Prefix "ERROR" -ForegroundColor Red } # Performance status icons function Get-StatusIcon { @@ -78,17 +138,26 @@ function Get-StatusText { Write-Host "" Write-Host "`u{2554}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2557}" -ForegroundColor Blue -Write-Host "`u{2551} NumSharp vs NumPy Comprehensive Benchmark Suite `u{2551}" -ForegroundColor Blue +if ($Experimental) { + Write-Host "`u{2551} NumSharp Experimental Benchmark Suite `u{2551}" -ForegroundColor Magenta +} else { + Write-Host "`u{2551} NumSharp vs NumPy Comprehensive Benchmark Suite `u{2551}" -ForegroundColor Blue +} Write-Host "`u{255A}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{255D}" -ForegroundColor Blue Write-Host "" +Write-Status "Results will be saved to: $ResultsDir" +Write-Log "Benchmark started: $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')" +Write-Log "Mode: $(if ($Experimental) { 'Experimental' } else { 'Standard' }), Suite: $Suite, Quick: $Quick" + # Initialize report +$reportTimestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss" $report = @" # NumSharp Performance Benchmark Report -**Generated:** $Timestamp +**Generated:** $reportTimestamp **Mode:** $(if ($Quick) { 'Quick (reduced iterations)' } else { 'Full' }) -**Suite:** $Suite +**Suite:** $Suite $(if ($Experimental) { '(Experimental)' } else { '' }) --- @@ -122,28 +191,36 @@ $report += "`n" # ============================================================================= $pythonResults = @() -$pythonJsonPath = Join-Path $ScriptDir "benchmark-report.json" +$numpyJsonPath = Join-Path $ResultsDir "numpy-results.json" if (-not $SkipPython) { Write-Status "Running Python/NumPy benchmarks..." $pythonScript = Join-Path $ScriptDir "NumSharp.Benchmark.Python\numpy_benchmark.py" - $pythonArgs = @($pythonScript, "--output", $pythonJsonPath) + $pythonArgs = @($pythonScript, "--output", $numpyJsonPath) if ($Quick) { $pythonArgs += "--quick" } if ($Suite -ne 'all') { $pythonArgs += "--suite"; $pythonArgs += $Suite } if ($Type) { $pythonArgs += "--type"; $pythonArgs += $Type } if ($Size) { $pythonArgs += "--size"; $pythonArgs += $Size } + $pythonCmd = "python " + ($pythonArgs -join " ") + Write-Log "Command: $pythonCmd" + try { - & python @pythonArgs 2>&1 | ForEach-Object { Write-Host " $_" } + & python @pythonArgs 2>&1 | ForEach-Object { + Write-Log $_ -Prefix "Python" + } - if (Test-Path $pythonJsonPath) { - $pythonResults = Get-Content $pythonJsonPath | ConvertFrom-Json + if (Test-Path $numpyJsonPath) { + $pythonResults = Get-Content $numpyJsonPath | ConvertFrom-Json Write-Success "Python benchmarks complete ($($pythonResults.Count) results)" } } catch { Write-Warning "Python benchmarks failed: $_" } +} else { + Write-Status "Skipping Python benchmarks (-SkipPython)" + Write-Log "Skipping Python benchmarks" } # ============================================================================= @@ -152,6 +229,7 @@ if (-not $SkipPython) { $csharpResults = @{} $csharpJsonDir = $null +$numsharpJsonPath = Join-Path $ResultsDir "numsharp-results.json" if (-not $SkipCSharp) { Write-Status "Building C# benchmarks..." @@ -167,23 +245,86 @@ if (-not $SkipCSharp) { $jobType = if ($Quick) { "Short" } else { "Medium" } - # Build filter based on suite - $filter = switch ($Suite) { - 'dispatch' { "*Dispatch*" } - 'fusion' { "*Fusion*" } - 'arithmetic' { "*Arithmetic*" } - 'unary' { "*Unary*,*Math*,*ExpLog*,*Trig*,*Power*" } - 'reduction' { "*Reduction*,*Sum*,*Mean*,*VarStd*,*MinMax*,*Prod*" } - 'broadcast' { "*Broadcast*" } - 'creation' { "*Creation*" } - 'manipulation' { "*Manipulation*,*Reshape*,*Stack*,*Dims*" } - 'slicing' { "*Slice*" } - default { "*" } + # Build filter based on suite and experimental flag + if ($Experimental) { + # Experimental benchmarks (dispatch, fusion) are research benchmarks + # that don't correspond to NumPy operations + $filter = switch ($Suite) { + 'dispatch' { "*DispatchBenchmarks*" } + 'fusion' { "*FusionBenchmarks*" } + default { "*DispatchBenchmarks*,*FusionBenchmarks*" } + } + } else { + $filter = switch ($Suite) { + 'arithmetic' { "*Arithmetic*" } + 'unary' { "*Unary*,*Math*,*ExpLog*,*Trig*,*Power*" } + 'reduction' { "*Reduction*,*Sum*,*Mean*,*VarStd*,*MinMax*,*Prod*" } + 'broadcast' { "*Broadcast*" } + 'creation' { "*Creation*" } + 'manipulation' { "*Manipulation*,*Reshape*,*Stack*,*Dims*" } + 'slicing' { "*Slice*" } + default { "*" } + } + } + + # Map -Type parameter to C# DType filter + # NumPy dtype names -> C# NPTypeCode names + # BDN filter format: namespace.class.method(N: 10000000, DType: Int32) + $dtypeFilter = "" + if ($Type) { + $dtypeMap = @{ + 'int32' = 'Int32' + 'int64' = 'Int64' + 'float32' = 'Single' + 'float64' = 'Double' + 'uint8' = 'Byte' + 'int16' = 'Int16' + 'uint16' = 'UInt16' + 'uint32' = 'UInt32' + 'uint64' = 'UInt64' + 'bool' = 'Boolean' + } + $csharpType = $dtypeMap[$Type.ToLower()] + if ($csharpType) { + $dtypeFilter = "*DType: $csharpType*" + Write-Log "Filtering C# benchmarks to DType=$csharpType" + } else { + Write-Warning "Unknown type '$Type' - running all types" + } } + # In Quick mode, only run N=10M (matches NumPy comparison) + # This dramatically reduces benchmark count + $sizeFilter = "" + if ($Quick) { + $sizeFilter = "*N: 10000000*" + Write-Log "Quick mode: filtering to N=10000000 only" + } + + # Combine filters: suite AND size AND dtype + # BDN parameter order is (N: value, DType: type) so size filter must come before dtype + # BDN uses glob patterns on full name: namespace.class.method(params) + # Multiple wildcards in same pattern act as AND + $filterParts = @() + foreach ($suitePart in $filter.Split(',')) { + $combined = $suitePart.Trim() + if ($sizeFilter) { $combined += $sizeFilter } # N: comes first in BDN output + if ($dtypeFilter) { $combined += $dtypeFilter } # DType: comes second + $filterParts += $combined + } + $filter = $filterParts -join "," + + $csharpCmd = "dotnet run -c Release --no-build -f net10.0 -- --job $jobType --filter $filter --exporters json" + Write-Log "Command: $csharpCmd" + # Run and capture output $output = & dotnet run -c Release --no-build -f net10.0 -- --job $jobType --filter $filter --exporters json 2>&1 + # Log all output + foreach ($line in $output) { + Write-Log $line -Prefix "C#" + } + # Parse the summary table from output $inTable = $false $tableLines = @() @@ -198,10 +339,25 @@ if (-not $SkipCSharp) { Write-Success "C# benchmarks complete" } - # Find JSON results directory + # Find JSON results directory and copy artifacts $artifactsDir = Join-Path $csharpDir "BenchmarkDotNet.Artifacts\results" if (Test-Path $artifactsDir) { $csharpJsonDir = $artifactsDir + + # Copy BDN artifacts to results folder + $bdnFiles = Get-ChildItem $artifactsDir -Filter "*.json" -ErrorAction SilentlyContinue + foreach ($file in $bdnFiles) { + Copy-Item $file.FullName -Destination $ResultsDir -Force + Write-Log "Copied BDN artifact: $($file.Name)" + } + $mdFiles = Get-ChildItem $artifactsDir -Filter "*.md" -ErrorAction SilentlyContinue + foreach ($file in $mdFiles) { + Copy-Item $file.FullName -Destination $ResultsDir -Force + Write-Log "Copied BDN artifact: $($file.Name)" + } + + # Create consolidated numsharp-results.json from BDN results + # (merge-results.py will read from BDN artifacts dir) } } catch { @@ -209,6 +365,9 @@ if (-not $SkipCSharp) { } finally { Pop-Location } +} else { + Write-Status "Skipping C# benchmarks (-SkipCSharp)" + Write-Log "Skipping C# benchmarks" } # ============================================================================= @@ -309,7 +468,7 @@ $report += @" ## Quick Reference -Ratio = NumSharp / NumPy | ✅ ≤1x | 🟡 ≤2x | 🟠 ≤5x | 🔴 >5x +Ratio = NumSharp / NumPy | `u{2705} ≤1x | `u{1F7E1} ≤2x | `u{1F7E0} ≤5x | `u{1F534} >5x **See benchmark-report.md for the full comparison matrix.** @@ -318,27 +477,63 @@ Ratio = NumSharp / NumPy | ✅ ≤1x | 🟡 ≤2x | 🟠 ≤5x | 🔴 >5x *Generated by run-benchmarks.ps1* "@ -# Write report -$report | Out-File -FilePath $ReportPath -Encoding UTF8 - -Write-Host "" -Write-Success "Report generated: $ReportPath" +# Write report to results folder +$reportPath = Join-Path $ResultsDir "benchmark-report.md" +$report | Out-File -FilePath $reportPath -Encoding UTF8 +Write-Log "Report written to: $reportPath" # ============================================================================= -# Generate Unified Comparison (if both results exist) +# Generate Unified Comparison (if both results exist and not Experimental) # ============================================================================= $mergeScript = Join-Path $ScriptDir "scripts\merge-results.py" +$mergedJsonPath = Join-Path $ResultsDir "benchmark-report.json" +$mergedCsvPath = Join-Path $ResultsDir "benchmark-report.csv" -if ((Test-Path $pythonJsonPath) -and (Test-Path $mergeScript)) { +if (-not $Experimental -and (Test-Path $numpyJsonPath) -and (Test-Path $mergeScript) -and $csharpJsonDir) { Write-Status "Generating unified comparison..." + Write-Log "Running merge script..." + + $outputBase = Join-Path $ResultsDir "benchmark-report" + $mergeCmd = "python $mergeScript --numpy $numpyJsonPath --csharp $csharpJsonDir --output $outputBase" + Write-Log "Command: $mergeCmd" + try { - $outputBase = Join-Path $ScriptDir "benchmark-report" - & python $mergeScript --numpy $pythonJsonPath --output $outputBase 2>&1 | ForEach-Object { Write-Host " $_" } + & python $mergeScript --numpy $numpyJsonPath --csharp $csharpJsonDir --output $outputBase 2>&1 | ForEach-Object { + Write-Log $_ -Prefix "Merge" + } Write-Success "Unified results generated" } catch { Write-Warning "Failed to generate unified results: $_" } +} elseif ($Experimental) { + Write-Log "Skipping merge (Experimental mode - no NumPy comparison)" +} elseif (-not (Test-Path $numpyJsonPath)) { + Write-Log "Skipping merge (no numpy-results.json)" +} + +# ============================================================================= +# Copy results to benchmark/ root +# ============================================================================= + +Write-Status "Copying results to benchmark root..." + +$filesToCopy = @( + "benchmark.log", + "benchmark-report.md", + "benchmark-report.json", + "benchmark-report.csv", + "numpy-results.json", + "numsharp-results.json" +) + +foreach ($fileName in $filesToCopy) { + $sourcePath = Join-Path $ResultsDir $fileName + if (Test-Path $sourcePath) { + $destPath = Join-Path $ScriptDir $fileName + Copy-Item $sourcePath -Destination $destPath -Force + Write-Log "Copied to root: $fileName" + } } # ============================================================================= @@ -346,8 +541,17 @@ if ((Test-Path $pythonJsonPath) -and (Test-Path $mergeScript)) { # ============================================================================= $readmePath = Join-Path $ScriptDir "README.md" +$mergedReportPath = Join-Path $ResultsDir "benchmark-report.md" + +# Prefer merged report if available +if (Test-Path (Join-Path $ResultsDir "benchmark-report.md")) { + $reportToCopy = Join-Path $ResultsDir "benchmark-report.md" +} else { + $reportToCopy = $reportPath +} + if (Test-Path $readmePath) { - Copy-Item -Path $ReportPath -Destination $readmePath -Force + Copy-Item -Path $reportToCopy -Destination $readmePath -Force Write-Success "README.md updated with benchmark results" } else { Write-Warning "README.md not found - skipping auto-update (create it manually to enable)" @@ -360,8 +564,15 @@ Write-Host "`u{2554}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2 Write-Host "`u{2551} Benchmark Complete! `u{2551}" -ForegroundColor Green Write-Host "`u{255A}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{2550}`u{255D}" -ForegroundColor Green Write-Host "" -Write-Host " Report: " -NoNewline; Write-Host $ReportPath -ForegroundColor Yellow -Write-Host " README: " -NoNewline; Write-Host $readmePath -ForegroundColor Yellow -Write-Host " JSON: " -NoNewline; Write-Host $pythonJsonPath -ForegroundColor Yellow -Write-Host " View: " -NoNewline; Write-Host "code $ReportPath" -ForegroundColor Cyan +Write-Host " Results: " -NoNewline; Write-Host $ResultsDir -ForegroundColor Yellow +Write-Host " Report: " -NoNewline; Write-Host (Join-Path $ScriptDir "benchmark-report.md") -ForegroundColor Yellow +Write-Host " README: " -NoNewline; Write-Host $readmePath -ForegroundColor Yellow +Write-Host " Log: " -NoNewline; Write-Host $LogPath -ForegroundColor Yellow +if (Test-Path $numpyJsonPath) { + Write-Host " NumPy: " -NoNewline; Write-Host $numpyJsonPath -ForegroundColor Yellow +} +if (Test-Path $mergedJsonPath) { + Write-Host " Merged: " -NoNewline; Write-Host $mergedJsonPath -ForegroundColor Yellow +} +Write-Host " View: " -NoNewline; Write-Host "code $ResultsDir" -ForegroundColor Cyan Write-Host "" diff --git a/benchmark/scripts/merge-results.py b/benchmark/scripts/merge-results.py index 568e86ae..41ff0db5 100644 --- a/benchmark/scripts/merge-results.py +++ b/benchmark/scripts/merge-results.py @@ -200,23 +200,56 @@ def get_status_icon(status: str) -> str: def normalize_op_name(name: str) -> str: - """Normalize operation name for matching.""" - # Remove dtype suffix like " (int32)" + """Normalize operation name for matching. + + Maps C# BDN method titles to Python benchmark names. + Both sides include dtype suffix like " (int32)" which is stripped. + """ import re - name = re.sub(r'\s*\([^)]*\)\s*$', '', name) + # Remove dtype suffix like " (int32)" or " (float64)" + # Only remove parentheses that contain dtype names, not descriptive text like "(element-wise)" + dtype_pattern = r'\s*\((int32|int64|float32|float64|uint8|int16|uint16|uint32|uint64|bool|decimal)\)\s*$' + name = re.sub(dtype_pattern, '', name) # Remove quotes name = name.strip("'\"") - # Normalize common patterns - name = name.lower() + # Normalize whitespace name = re.sub(r'\s+', ' ', name) - # Map C# names to NumPy names + # Lowercase for comparison + name = name.lower() + + # Map C# BDN method titles to Python benchmark names + # C# uses titles like "a + b (element-wise)" while Python uses same format mappings = { + # Arithmetic - Add + 'a + b (element-wise)': 'a + b (element-wise)', + 'np.add(a, b)': 'np.add(a, b)', + 'a + scalar': 'a + scalar', + 'a + 5 (literal)': 'a + 5 (literal)', + + # Arithmetic - Subtract + 'a - b (element-wise)': 'a - b (element-wise)', + 'a - scalar': 'a - scalar', + 'scalar - a': 'scalar - a', + + # Arithmetic - Multiply + 'a * b (element-wise)': 'a * b (element-wise)', + 'a * a (square)': 'a * a (square)', + 'a * scalar': 'a * scalar', + 'a * 2 (literal)': 'a * 2 (literal)', + + # Arithmetic - Divide + 'a / b (element-wise)': 'a / b (element-wise)', + 'a / scalar': 'a / scalar', + 'scalar / a': 'scalar / a', + + # Arithmetic - Modulo + 'a % b (element-wise)': 'a % b (element-wise)', + 'a % 7 (literal)': 'a % 7 (literal)', + + # Reduction 'np.sum(a) [full]': 'np.sum', 'np.sum(a, axis=0)': 'np.sum axis=0', 'np.sum(a, axis=1)': 'np.sum axis=1', - 'a + b (element-wise)': 'a + b', - 'np.add(a, b)': 'a + b', - 'a + scalar': 'a + scalar', } return mappings.get(name, name) From 7dc3574fdf4b4e41b8975653ab0cfef7b716f143 Mon Sep 17 00:00:00 2001 From: Eli Belash Date: Sat, 21 Feb 2026 14:09:54 +0200 Subject: [PATCH 08/15] feat(benchmark): add NativeMemory allocation benchmarks for issue #528 Benchmarks comparing allocation strategies: - AllocationMicroBenchmarks: Marshal.AllocHGlobal vs NativeMemory.Alloc/AlignedAlloc - ZeroInitBenchmarks: Alloc+InitBlock vs AllocZeroed for np.zeros optimization - NumSharpAllocationBenchmarks: End-to-end NumSharp array creation impact - AllocationSizeBenchmarks: Size scaling from 64B to 64MB Menu option 13 added for allocation benchmarks. Co-Authored-By: Claude Opus 4.6 --- .../Allocation/AllocationMicroBenchmarks.cs | 83 +++++++++++++ .../Allocation/AllocationSizeBenchmarks.cs | 68 +++++++++++ .../NumSharpAllocationBenchmarks.cs | 111 ++++++++++++++++++ .../Allocation/ZeroInitBenchmarks.cs | 109 +++++++++++++++++ 4 files changed, 371 insertions(+) create mode 100644 benchmark/NumSharp.Benchmark.GraphEngine/Benchmarks/Allocation/AllocationMicroBenchmarks.cs create mode 100644 benchmark/NumSharp.Benchmark.GraphEngine/Benchmarks/Allocation/AllocationSizeBenchmarks.cs create mode 100644 benchmark/NumSharp.Benchmark.GraphEngine/Benchmarks/Allocation/NumSharpAllocationBenchmarks.cs create mode 100644 benchmark/NumSharp.Benchmark.GraphEngine/Benchmarks/Allocation/ZeroInitBenchmarks.cs diff --git a/benchmark/NumSharp.Benchmark.GraphEngine/Benchmarks/Allocation/AllocationMicroBenchmarks.cs b/benchmark/NumSharp.Benchmark.GraphEngine/Benchmarks/Allocation/AllocationMicroBenchmarks.cs new file mode 100644 index 00000000..b1643bac --- /dev/null +++ b/benchmark/NumSharp.Benchmark.GraphEngine/Benchmarks/Allocation/AllocationMicroBenchmarks.cs @@ -0,0 +1,83 @@ +using System.Runtime.InteropServices; +using BenchmarkDotNet.Attributes; +using NumSharp.Benchmark.GraphEngine.Infrastructure; + +namespace NumSharp.Benchmark.GraphEngine.Benchmarks.Allocation; + +/// +/// Micro-benchmarks comparing allocation primitives: +/// - Marshal.AllocHGlobal (current) +/// - NativeMemory.Alloc (proposed) +/// - NativeMemory.AlignedAlloc (for SIMD) +/// +/// These benchmarks inform issue #528: NativeMemory modernization. +/// +[BenchmarkCategory("Allocation", "Micro")] +public class AllocationMicroBenchmarks : BenchmarkBase +{ + /// + /// Byte counts to allocate (matching typical NumSharp array sizes). + /// + [Params(64, 1_000, 100_000, 10_000_000)] + public int Bytes { get; set; } + + // ======================================================================== + // Allocation Only (no free) - measures allocation overhead + // ======================================================================== + + [Benchmark(Baseline = true, Description = "Marshal.AllocHGlobal")] + [BenchmarkCategory("AllocOnly")] + public nint MarshalAllocHGlobal() => Marshal.AllocHGlobal(Bytes); + + [Benchmark(Description = "NativeMemory.Alloc")] + [BenchmarkCategory("AllocOnly")] + public unsafe void* NativeMemoryAlloc() => NativeMemory.Alloc((nuint)Bytes); + + [Benchmark(Description = "NativeMemory.AlignedAlloc(32)")] + [BenchmarkCategory("AllocOnly")] + public unsafe void* NativeMemoryAlignedAlloc32() => NativeMemory.AlignedAlloc((nuint)Bytes, 32); + + [Benchmark(Description = "NativeMemory.AlignedAlloc(64)")] + [BenchmarkCategory("AllocOnly")] + public unsafe void* NativeMemoryAlignedAlloc64() => NativeMemory.AlignedAlloc((nuint)Bytes, 64); + + [Benchmark(Description = "NativeMemory.AllocZeroed")] + [BenchmarkCategory("AllocOnly")] + public unsafe void* NativeMemoryAllocZeroed() => NativeMemory.AllocZeroed((nuint)Bytes); + + // ======================================================================== + // Round-Trip (alloc + free) - measures full lifecycle + // ======================================================================== + + [Benchmark(Description = "Marshal alloc+free")] + [BenchmarkCategory("RoundTrip")] + public void MarshalRoundTrip() + { + var ptr = Marshal.AllocHGlobal(Bytes); + Marshal.FreeHGlobal(ptr); + } + + [Benchmark(Description = "NativeMemory alloc+free")] + [BenchmarkCategory("RoundTrip")] + public unsafe void NativeMemoryRoundTrip() + { + var ptr = NativeMemory.Alloc((nuint)Bytes); + NativeMemory.Free(ptr); + } + + [Benchmark(Description = "NativeMemory aligned alloc+free")] + [BenchmarkCategory("RoundTrip")] + public unsafe void NativeMemoryAlignedRoundTrip() + { + var ptr = NativeMemory.AlignedAlloc((nuint)Bytes, 32); + NativeMemory.AlignedFree(ptr); + } + + [Benchmark(Description = "NativeMemory zeroed alloc+free")] + [BenchmarkCategory("RoundTrip")] + public unsafe void NativeMemoryZeroedRoundTrip() + { + var ptr = NativeMemory.AllocZeroed((nuint)Bytes); + NativeMemory.Free(ptr); + } +} diff --git a/benchmark/NumSharp.Benchmark.GraphEngine/Benchmarks/Allocation/AllocationSizeBenchmarks.cs b/benchmark/NumSharp.Benchmark.GraphEngine/Benchmarks/Allocation/AllocationSizeBenchmarks.cs new file mode 100644 index 00000000..b6f48131 --- /dev/null +++ b/benchmark/NumSharp.Benchmark.GraphEngine/Benchmarks/Allocation/AllocationSizeBenchmarks.cs @@ -0,0 +1,68 @@ +using System.Runtime.InteropServices; +using BenchmarkDotNet.Attributes; +using NumSharp.Benchmark.GraphEngine.Infrastructure; + +namespace NumSharp.Benchmark.GraphEngine.Benchmarks.Allocation; + +/// +/// Benchmarks allocation performance across a wide range of sizes. +/// Helps identify: +/// - Small allocation overhead (where dispatch cost dominates) +/// - Crossover points between allocation strategies +/// - Large allocation behavior (OS page allocation) +/// +[BenchmarkCategory("Allocation", "SizeScaling")] +public class AllocationSizeBenchmarks : BenchmarkBase +{ + /// + /// Byte counts covering common array sizes: + /// - 64B: Single cache line + /// - 256B: Small scalar arrays + /// - 1KB: Tiny arrays + /// - 4KB: Page size boundary + /// - 64KB: L1 cache size + /// - 256KB: L2 cache size + /// - 1MB: L3 cache boundary + /// - 4MB: Large arrays + /// - 16MB: Very large arrays + /// - 64MB: Memory-bound + /// + [Params(64, 256, 1024, 4096, 65536, 262144, 1048576, 4194304, 16777216, 67108864)] + public int Bytes { get; set; } + + // ======================================================================== + // Marshal vs NativeMemory comparison across sizes + // ======================================================================== + + [Benchmark(Baseline = true, Description = "Marshal.AllocHGlobal")] + [BenchmarkCategory("Compare")] + public void MarshalAlloc() + { + var ptr = Marshal.AllocHGlobal(Bytes); + Marshal.FreeHGlobal(ptr); + } + + [Benchmark(Description = "NativeMemory.Alloc")] + [BenchmarkCategory("Compare")] + public unsafe void NativeAlloc() + { + var ptr = NativeMemory.Alloc((nuint)Bytes); + NativeMemory.Free(ptr); + } + + [Benchmark(Description = "NativeMemory.AlignedAlloc(32)")] + [BenchmarkCategory("Compare")] + public unsafe void NativeAlignedAlloc() + { + var ptr = NativeMemory.AlignedAlloc((nuint)Bytes, 32); + NativeMemory.AlignedFree(ptr); + } + + [Benchmark(Description = "NativeMemory.AllocZeroed")] + [BenchmarkCategory("Compare")] + public unsafe void NativeAllocZeroed() + { + var ptr = NativeMemory.AllocZeroed((nuint)Bytes); + NativeMemory.Free(ptr); + } +} diff --git a/benchmark/NumSharp.Benchmark.GraphEngine/Benchmarks/Allocation/NumSharpAllocationBenchmarks.cs b/benchmark/NumSharp.Benchmark.GraphEngine/Benchmarks/Allocation/NumSharpAllocationBenchmarks.cs new file mode 100644 index 00000000..0cfdd56a --- /dev/null +++ b/benchmark/NumSharp.Benchmark.GraphEngine/Benchmarks/Allocation/NumSharpAllocationBenchmarks.cs @@ -0,0 +1,111 @@ +using BenchmarkDotNet.Attributes; +using NumSharp; +using NumSharp.Benchmark.GraphEngine.Infrastructure; + +namespace NumSharp.Benchmark.GraphEngine.Benchmarks.Allocation; + +/// +/// End-to-end NumSharp benchmarks measuring allocation impact: +/// - Array creation functions that allocate memory +/// - Operations that allocate output arrays +/// +/// These complement the micro-benchmarks by showing real-world impact. +/// +[BenchmarkCategory("Allocation", "NumSharp")] +public class NumSharpAllocationBenchmarks : TypedBenchmarkBase +{ + [Params(ArraySizeSource.Small, ArraySizeSource.Medium, ArraySizeSource.Large)] + public override int N { get; set; } + + [ParamsSource(nameof(Types))] + public new NPTypeCode DType { get; set; } + + /// + /// Types to benchmark. Focus on common types to keep benchmark time reasonable. + /// + public static IEnumerable Types => TypeParameterSource.MinimalTypes; + + private NDArray _a = null!; + private NDArray _b = null!; + + [GlobalSetup] + public void Setup() + { + _a = CreateRandomArray(N, DType, Seed); + _b = CreateRandomArray(N, DType, Seed + 1); + } + + [GlobalCleanup] + public void Cleanup() + { + _a = null!; + _b = null!; + GC.Collect(); + } + + // ======================================================================== + // Array Creation - Uninitialized + // ======================================================================== + + [Benchmark(Description = "np.empty(N) - uninitialized")] + [BenchmarkCategory("Creation", "Uninitialized")] + public NDArray Empty() => np.empty(new Shape(N), DType); + + // ======================================================================== + // Array Creation - Zero-Initialized + // This is the target for AllocZeroed optimization + // ======================================================================== + + [Benchmark(Description = "np.zeros(N) - zero-initialized")] + [BenchmarkCategory("Creation", "ZeroInit")] + public NDArray Zeros() => np.zeros(new Shape(N), DType); + + // ======================================================================== + // Array Creation - Value-Initialized + // ======================================================================== + + [Benchmark(Description = "np.ones(N) - ones")] + [BenchmarkCategory("Creation", "ValueInit")] + public NDArray Ones() => np.ones(new Shape(N), DType); + + [Benchmark(Description = "np.full(N, 42) - fill value")] + [BenchmarkCategory("Creation", "ValueInit")] + public NDArray Full() => np.full(new Shape(N), 42, DType); + + // ======================================================================== + // Array Creation - Sequential + // ======================================================================== + + [Benchmark(Description = "np.arange(N) - sequential")] + [BenchmarkCategory("Creation", "Sequential")] + public NDArray Arange() => np.arange(N); + + // ======================================================================== + // Operations That Allocate Output + // Shows allocation overhead in computation context + // ======================================================================== + + [Benchmark(Description = "a + b - binary op output alloc")] + [BenchmarkCategory("Operation", "Binary")] + public NDArray Add() => _a + _b; + + [Benchmark(Description = "a * b - binary op output alloc")] + [BenchmarkCategory("Operation", "Binary")] + public NDArray Multiply() => _a * _b; + + [Benchmark(Description = "np.sqrt(a) - unary op output alloc")] + [BenchmarkCategory("Operation", "Unary")] + public NDArray Sqrt() => np.sqrt(_a.astype(np.float64)); + + // ======================================================================== + // Copy Operations + // ======================================================================== + + [Benchmark(Description = "np.copy(a) - explicit copy")] + [BenchmarkCategory("Copy")] + public NDArray Copy() => np.copy(_a); + + [Benchmark(Description = "a.copy() - method copy")] + [BenchmarkCategory("Copy")] + public NDArray CopyMethod() => _a.copy(); +} diff --git a/benchmark/NumSharp.Benchmark.GraphEngine/Benchmarks/Allocation/ZeroInitBenchmarks.cs b/benchmark/NumSharp.Benchmark.GraphEngine/Benchmarks/Allocation/ZeroInitBenchmarks.cs new file mode 100644 index 00000000..c37f067b --- /dev/null +++ b/benchmark/NumSharp.Benchmark.GraphEngine/Benchmarks/Allocation/ZeroInitBenchmarks.cs @@ -0,0 +1,109 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using BenchmarkDotNet.Attributes; +using NumSharp.Benchmark.GraphEngine.Infrastructure; + +namespace NumSharp.Benchmark.GraphEngine.Benchmarks.Allocation; + +/// +/// Benchmarks comparing zero-initialization approaches for np.zeros: +/// - Current: Alloc + Unsafe.InitBlock +/// - Proposed: NativeMemory.AllocZeroed (OS may have fast paths) +/// - Alternative: Alloc + Span.Clear +/// +/// These benchmarks inform the np.zeros optimization decision in issue #528. +/// +[BenchmarkCategory("Allocation", "ZeroInit")] +public class ZeroInitBenchmarks : BenchmarkBase +{ + /// + /// Element counts (int32 = 4 bytes each). + /// Small: 4KB, Medium: 400KB, Large: 40MB + /// + [Params(1_000, 100_000, 10_000_000)] + public override int N { get; set; } + + private int _bytes; + + [GlobalSetup] + public void Setup() + { + _bytes = N * sizeof(int); + } + + // ======================================================================== + // Current NumSharp approach: Alloc + Unsafe.InitBlock + // Used in UnmanagedMemoryBlock when filling with zeros + // ======================================================================== + + [Benchmark(Baseline = true, Description = "Alloc + InitBlock (current)")] + [BenchmarkCategory("ZeroInit")] + public unsafe void AllocThenInitBlock() + { + var ptr = NativeMemory.Alloc((nuint)_bytes); + Unsafe.InitBlock(ptr, 0, (uint)_bytes); + NativeMemory.Free(ptr); + } + + // ======================================================================== + // Proposed: NativeMemory.AllocZeroed + // OS may use page zeroing, copy-on-write, or hardware optimizations + // ======================================================================== + + [Benchmark(Description = "AllocZeroed (proposed)")] + [BenchmarkCategory("ZeroInit")] + public unsafe void AllocZeroed() + { + var ptr = NativeMemory.AllocZeroed((nuint)_bytes); + NativeMemory.Free(ptr); + } + + // ======================================================================== + // Alternative: Alloc + Span.Clear + // Span.Clear may use SIMD internally + // ======================================================================== + + [Benchmark(Description = "Alloc + Span.Clear")] + [BenchmarkCategory("ZeroInit")] + public unsafe void AllocThenSpanClear() + { + var ptr = NativeMemory.Alloc((nuint)_bytes); + new Span(ptr, _bytes).Clear(); + NativeMemory.Free(ptr); + } + + // ======================================================================== + // Aligned variants - test if alignment helps zero-init + // ======================================================================== + + [Benchmark(Description = "AlignedAlloc(32) + InitBlock")] + [BenchmarkCategory("ZeroInit", "Aligned")] + public unsafe void AlignedAllocThenInitBlock() + { + var ptr = NativeMemory.AlignedAlloc((nuint)_bytes, 32); + Unsafe.InitBlock(ptr, 0, (uint)_bytes); + NativeMemory.AlignedFree(ptr); + } + + [Benchmark(Description = "AlignedAlloc(32) + Span.Clear")] + [BenchmarkCategory("ZeroInit", "Aligned")] + public unsafe void AlignedAllocThenSpanClear() + { + var ptr = NativeMemory.AlignedAlloc((nuint)_bytes, 32); + new Span(ptr, _bytes).Clear(); + NativeMemory.AlignedFree(ptr); + } + + // ======================================================================== + // Marshal.AllocHGlobal baseline for comparison + // ======================================================================== + + [Benchmark(Description = "Marshal.AllocHGlobal + InitBlock")] + [BenchmarkCategory("ZeroInit", "Marshal")] + public unsafe void MarshalAllocThenInitBlock() + { + var ptr = Marshal.AllocHGlobal(_bytes); + Unsafe.InitBlock((void*)ptr, 0, (uint)_bytes); + Marshal.FreeHGlobal(ptr); + } +} From 7d4715d77df9ed7831355eedbadcba3aefed8c8e Mon Sep 17 00:00:00 2001 From: Eli Belash Date: Sat, 21 Feb 2026 15:07:52 +0200 Subject: [PATCH 09/15] feat(SIMD): dynamic vector width detection for IL kernels Make IL kernel generator adaptive to available hardware SIMD support by detecting Vector512/256/128 at runtime instead of hardcoding Vector256. - Add VectorBits/VectorBytes static properties for hardware detection - Refactor GetVectorCount, EmitVectorLoad/Store/Operation to use detected width - Remove obsolete UmanagedArrayTests.cs (typo in filename, tests covered elsewhere) - Normalize line endings in csproj files Co-Authored-By: Claude Opus 4.6 --- .../Backends/Kernels/ILKernelGenerator.cs | 204 +++++++-------- src/NumSharp.Core/NumSharp.Core.csproj | 174 ++++++------- .../NumSharp.Benchmark.csproj | 64 ++--- .../Backends/Unmanaged/UmanagedArrayTests.cs | 241 ------------------ .../NumSharp.UnitTest.csproj | 158 ++++++------ 5 files changed, 302 insertions(+), 539 deletions(-) diff --git a/src/NumSharp.Core/Backends/Kernels/ILKernelGenerator.cs b/src/NumSharp.Core/Backends/Kernels/ILKernelGenerator.cs index 441c47c5..453c4c35 100644 --- a/src/NumSharp.Core/Backends/Kernels/ILKernelGenerator.cs +++ b/src/NumSharp.Core/Backends/Kernels/ILKernelGenerator.cs @@ -29,6 +29,19 @@ public static class ILKernelGenerator /// public static bool Enabled { get; set; } = true; + /// + /// Detected vector width at startup: 512, 256, 128, or 0 (no SIMD). + /// + public static readonly int VectorBits = + Vector512.IsHardwareAccelerated ? 512 : + Vector256.IsHardwareAccelerated ? 256 : + Vector128.IsHardwareAccelerated ? 128 : 0; + + /// + /// Number of bytes per vector register. + /// + public static readonly int VectorBytes = VectorBits / 8; + /// /// Number of IL-generated kernels in cache. /// @@ -39,6 +52,28 @@ public static class ILKernelGenerator /// public static void Clear() => _contiguousKernelCache.Clear(); + /// + /// Get the Vector container type (Vector128, Vector256, or Vector512). + /// + private static Type GetVectorContainerType() => VectorBits switch + { + 512 => typeof(Vector512), + 256 => typeof(Vector256), + 128 => typeof(Vector128), + _ => throw new NotSupportedException("No SIMD support") + }; + + /// + /// Get the Vector{Width}<T> generic type. + /// + private static Type GetVectorType(Type elementType) => VectorBits switch + { + 512 => typeof(Vector512<>).MakeGenericType(elementType), + 256 => typeof(Vector256<>).MakeGenericType(elementType), + 128 => typeof(Vector128<>).MakeGenericType(elementType), + _ => throw new NotSupportedException("No SIMD support") + }; + #region Public API /// @@ -332,58 +367,48 @@ private static bool IsSimdSupported() where T : unmanaged private static int GetVectorCount() where T : unmanaged { - return Vector256.Count; + return VectorBits switch + { + 512 => Vector512.Count, + 256 => Vector256.Count, + 128 => Vector128.Count, + _ => 1 + }; } private static void EmitVectorLoad(ILGenerator il) where T : unmanaged { - // Call Vector256.Load(T*) - var loadMethod = typeof(Vector256).GetMethod( - nameof(Vector256.Load), - BindingFlags.Public | BindingFlags.Static, - null, - new[] { typeof(T).MakePointerType() }, - null - ); + var containerType = GetVectorContainerType(); - if (loadMethod == null) - { - // Try the generic version - loadMethod = typeof(Vector256) - .GetMethods(BindingFlags.Public | BindingFlags.Static) - .First(m => m.Name == "Load" && m.IsGenericMethod && m.GetParameters().Length == 1) - .MakeGenericMethod(typeof(T)); - } + var loadMethod = containerType + .GetMethods(BindingFlags.Public | BindingFlags.Static) + .First(m => m.Name == "Load" && m.IsGenericMethod && + m.GetParameters().Length == 1 && + m.GetParameters()[0].ParameterType.IsPointer) + .MakeGenericMethod(typeof(T)); - il.EmitCall(OpCodes.Call, loadMethod!, null); + il.EmitCall(OpCodes.Call, loadMethod, null); } private static void EmitVectorStore(ILGenerator il) where T : unmanaged { - // Stack has: [Vector256, T*] - // Need to call Vector256.Store(Vector256 source, T* destination) - // But Store takes (this Vector256, T*) so we need the extension method - - var storeMethod = typeof(Vector256).GetMethods(BindingFlags.Public | BindingFlags.Static) - .Where(m => m.Name == "Store" && m.IsGenericMethod) - .Select(m => m.MakeGenericMethod(typeof(T))) - .FirstOrDefault(m => - { - var p = m.GetParameters(); - return p.Length == 2 && - p[0].ParameterType == typeof(Vector256) && - p[1].ParameterType == typeof(T).MakePointerType(); - }); + var containerType = GetVectorContainerType(); + var vectorType = GetVectorType(typeof(T)); - if (storeMethod == null) - throw new InvalidOperationException($"Could not find Vector256.Store<{typeof(T).Name}> method"); + var storeMethod = containerType + .GetMethods(BindingFlags.Public | BindingFlags.Static) + .First(m => m.Name == "Store" && m.IsGenericMethod && + m.GetParameters().Length == 2 && + m.GetParameters()[0].ParameterType.IsGenericType) + .MakeGenericMethod(typeof(T)); il.EmitCall(OpCodes.Call, storeMethod, null); } private static void EmitVectorOperation(ILGenerator il, BinaryOp op) where T : unmanaged { - // Stack has two Vector256 values, need to emit the operation + var vectorType = GetVectorType(typeof(T)); + string methodName = op switch { BinaryOp.Add => "op_Addition", @@ -393,18 +418,12 @@ private static void EmitVectorOperation(ILGenerator il, BinaryOp op) where T _ => throw new NotSupportedException($"Operation {op} not supported for SIMD") }; - // Look for the operator on Vector256 - var vectorType = typeof(Vector256); - var opMethod = vectorType.GetMethod( - methodName, + var opMethod = vectorType.GetMethod(methodName, BindingFlags.Public | BindingFlags.Static, - null, - new[] { vectorType, vectorType }, - null - ); + null, new[] { vectorType, vectorType }, null); if (opMethod == null) - throw new InvalidOperationException($"Could not find {methodName} for Vector256<{typeof(T).Name}>"); + throw new InvalidOperationException($"Could not find {methodName} for {vectorType.Name}"); il.EmitCall(OpCodes.Call, opMethod, null); } @@ -1561,31 +1580,30 @@ internal static Type GetClrType(NPTypeCode type) } /// - /// Check if type supports SIMD Vector256 operations. + /// Check if type supports SIMD operations (V128/V256/V512). /// internal static bool CanUseSimd(NPTypeCode type) { + if (VectorBits == 0) return false; // No SIMD hardware + return type switch { NPTypeCode.Byte => true, - NPTypeCode.Int16 => true, - NPTypeCode.UInt16 => true, - NPTypeCode.Int32 => true, - NPTypeCode.UInt32 => true, - NPTypeCode.Int64 => true, - NPTypeCode.UInt64 => true, - NPTypeCode.Single => true, - NPTypeCode.Double => true, - _ => false // bool, char, decimal don't have Vector256 support + NPTypeCode.Int16 or NPTypeCode.UInt16 => true, + NPTypeCode.Int32 or NPTypeCode.UInt32 => true, + NPTypeCode.Int64 or NPTypeCode.UInt64 => true, + NPTypeCode.Single or NPTypeCode.Double => true, + _ => false // Boolean, Char, Decimal }; } /// - /// Get Vector256 element count for type. + /// Get vector element count for type (adapts to V128/V256/V512). /// internal static int GetVectorCount(NPTypeCode type) { - return 32 / GetTypeSize(type); // Vector256 is 32 bytes + if (VectorBits == 0) return 1; // Scalar fallback + return VectorBytes / GetTypeSize(type); } /// @@ -1881,96 +1899,82 @@ private static void EmitDecimalOperation(ILGenerator il, BinaryOp op) } /// - /// Emit Vector256.Load for NPTypeCode. + /// Emit Vector.Load for NPTypeCode (adapts to V128/V256/V512). /// internal static void EmitVectorLoad(ILGenerator il, NPTypeCode type) { + var containerType = GetVectorContainerType(); var clrType = GetClrType(type); - var loadMethod = typeof(Vector256) + + var loadMethod = containerType .GetMethods(BindingFlags.Public | BindingFlags.Static) - .First(m => m.Name == "Load" && m.IsGenericMethod && m.GetParameters().Length == 1) + .First(m => m.Name == "Load" && m.IsGenericMethod && + m.GetParameters().Length == 1 && + m.GetParameters()[0].ParameterType.IsPointer) .MakeGenericMethod(clrType); il.EmitCall(OpCodes.Call, loadMethod, null); } /// - /// Emit Vector256.Create for NPTypeCode (broadcasts scalar to all vector elements). - /// Stack must have scalar value on top; result is Vector256 on stack. + /// Emit Vector.Create for NPTypeCode (broadcasts scalar to all vector elements). + /// Stack must have scalar value on top; result is Vector on stack. /// internal static void EmitVectorCreate(ILGenerator il, NPTypeCode type) { + var containerType = GetVectorContainerType(); var clrType = GetClrType(type); - // Vector256.Create(T value) - generic method that takes single scalar - var createMethod = typeof(Vector256) + + var createMethod = containerType .GetMethods(BindingFlags.Public | BindingFlags.Static) - .Where(m => m.Name == "Create" && m.IsGenericMethod) - .Select(m => m.MakeGenericMethod(clrType)) - .First(m => - { - var p = m.GetParameters(); - return p.Length == 1 && p[0].ParameterType == clrType; - }); + .First(m => m.Name == "Create" && m.IsGenericMethod && + m.GetParameters().Length == 1 && + !m.GetParameters()[0].ParameterType.IsPointer) + .MakeGenericMethod(clrType); il.EmitCall(OpCodes.Call, createMethod, null); } /// - /// Emit Vector256.Store for NPTypeCode. + /// Emit Vector.Store for NPTypeCode (adapts to V128/V256/V512). /// internal static void EmitVectorStore(ILGenerator il, NPTypeCode type) { + var containerType = GetVectorContainerType(); var clrType = GetClrType(type); - var vectorType = typeof(Vector256<>).MakeGenericType(clrType); - var ptrType = clrType.MakePointerType(); - var storeMethod = typeof(Vector256) + var storeMethod = containerType .GetMethods(BindingFlags.Public | BindingFlags.Static) - .Where(m => m.Name == "Store" && m.IsGenericMethod) - .Select(m => m.MakeGenericMethod(clrType)) - .FirstOrDefault(m => - { - var p = m.GetParameters(); - return p.Length == 2 && - p[0].ParameterType == vectorType && - p[1].ParameterType == ptrType; - }); - - if (storeMethod == null) - throw new InvalidOperationException($"Could not find Vector256.Store for {type}"); + .First(m => m.Name == "Store" && m.IsGenericMethod && + m.GetParameters().Length == 2 && + m.GetParameters()[0].ParameterType.IsGenericType) + .MakeGenericMethod(clrType); il.EmitCall(OpCodes.Call, storeMethod, null); } /// - /// Emit Vector256 operation for NPTypeCode. + /// Emit Vector operation for NPTypeCode (adapts to V128/V256/V512). /// internal static void EmitVectorOperation(ILGenerator il, BinaryOp op, NPTypeCode type) { var clrType = GetClrType(type); - var vectorType = typeof(Vector256<>).MakeGenericType(clrType); + var vectorType = GetVectorType(clrType); - var methodName = op switch + string methodName = op switch { BinaryOp.Add => "op_Addition", BinaryOp.Subtract => "op_Subtraction", BinaryOp.Multiply => "op_Multiply", BinaryOp.Divide => "op_Division", - _ => throw new NotSupportedException($"SIMD operation {op} not supported") + _ => throw new NotSupportedException($"Operation {op} not supported for SIMD") }; - var opMethod = vectorType.GetMethod( - methodName, + var opMethod = vectorType.GetMethod(methodName, BindingFlags.Public | BindingFlags.Static, - null, - new[] { vectorType, vectorType }, - null - ); - - if (opMethod == null) - throw new InvalidOperationException($"Could not find {methodName} for Vector256<{type}>"); + null, new[] { vectorType, vectorType }, null); - il.EmitCall(OpCodes.Call, opMethod, null); + il.EmitCall(OpCodes.Call, opMethod!, null); } #endregion diff --git a/src/NumSharp.Core/NumSharp.Core.csproj b/src/NumSharp.Core/NumSharp.Core.csproj index 9bcd97d0..60dd5c11 100644 --- a/src/NumSharp.Core/NumSharp.Core.csproj +++ b/src/NumSharp.Core/NumSharp.Core.csproj @@ -1,88 +1,88 @@ - - - net8.0;net10.0 - true - true - Eli Belash, Haiping Chen, Meinrad Recheis, Deepak Kumar Battini - ../../packages - NumSharp is the fundamental library for scientific computing with .NET providing a similar API to python's numpy scientific library. NumSharp has full N-D, broadcasting and axis support. If you want to use .NET to get started with machine learning, NumSharp will be your best tool. - https://github.com/SciSharp - 2021 © SciSharp STACK Team - https://github.com/SciSharp/NumSharp - - 0.40.0 - 0.40.0 - git - Numpy, NumSharp, MachineLearning, Math, Scientific, Numeric, Mathlab, SciSharp - - latest - https://avatars3.githubusercontent.com/u/44989469?s=200&v=4 - NumSharp - NumSharp - SciSharp STACK - NumSharp - 0.40.0 - $(Version)-$(VersionSuffix) - true - Open.snk - $(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb - AnyCPU - LICENSE - false - Debug;Release;Publish - NumSharp - 0.40.0 - true - - - - true - true - - - - - - - - - - - - - - - - - - - - - True - - - - - - - - - - - - - - - - - - - - - - - - - - + + + net8.0;net10.0 + true + true + Eli Belash, Haiping Chen, Meinrad Recheis, Deepak Kumar Battini + ../../packages + NumSharp is the fundamental library for scientific computing with .NET providing a similar API to python's numpy scientific library. NumSharp has full N-D, broadcasting and axis support. If you want to use .NET to get started with machine learning, NumSharp will be your best tool. + https://github.com/SciSharp + 2021 © SciSharp STACK Team + https://github.com/SciSharp/NumSharp + + 0.40.0 + 0.40.0 + git + Numpy, NumSharp, MachineLearning, Math, Scientific, Numeric, Mathlab, SciSharp + + latest + https://avatars3.githubusercontent.com/u/44989469?s=200&v=4 + NumSharp + NumSharp + SciSharp STACK + NumSharp + 0.40.0 + $(Version)-$(VersionSuffix) + true + Open.snk + $(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb + AnyCPU + LICENSE + false + Debug;Release;Publish + NumSharp + 0.40.0 + true + + + + true + true + + + + + + + + + + + + + + + + + + + + + True + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/NumSharp.Benchmark/NumSharp.Benchmark.csproj b/test/NumSharp.Benchmark/NumSharp.Benchmark.csproj index af1bdf41..0a1e29e2 100644 --- a/test/NumSharp.Benchmark/NumSharp.Benchmark.csproj +++ b/test/NumSharp.Benchmark/NumSharp.Benchmark.csproj @@ -1,32 +1,32 @@ - - - - Exe - net8.0;net10.0 - latest - AnyCPU;x64 - - - true - Open.snk - Debug;Release;Publish - true - - - - - - - - - - - - - - - - - - - + + + + Exe + net8.0;net10.0 + latest + AnyCPU;x64 + + + true + Open.snk + Debug;Release;Publish + true + + + + + + + + + + + + + + + + + + + diff --git a/test/NumSharp.UnitTest/Backends/Unmanaged/UmanagedArrayTests.cs b/test/NumSharp.UnitTest/Backends/Unmanaged/UmanagedArrayTests.cs index 22cb6395..e69de29b 100644 --- a/test/NumSharp.UnitTest/Backends/Unmanaged/UmanagedArrayTests.cs +++ b/test/NumSharp.UnitTest/Backends/Unmanaged/UmanagedArrayTests.cs @@ -1,241 +0,0 @@ -using System.Linq; -using System.Runtime.InteropServices; -using AwesomeAssertions; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using NumSharp.Backends; -using NumSharp.Backends.Unmanaged; - -namespace NumSharp.UnitTest.Backends.Unmanaged -{ - public class UmanagedArrayTests - { - [Test] - public void Slice() - { - var mem = new UnmanagedMemoryBlock(1000); - try - { - for (int i = 0; i < 1000; i++) - { - mem[i] = i; - } - - var arr = new ArraySlice(mem); - var r = arr.Slice(50, 10); - var rr = r.Slice(0, 5); - - r.ToArray().Should().ContainInOrder(Enumerable.Range(50, 10)); - rr.ToArray().Should().ContainInOrder(Enumerable.Range(50, 5)); - } - finally - { - mem.Free(); - } - } - - [Test] - public void Fill() - { - var mem = new UnmanagedMemoryBlock(1000); - try - { - for (int i = 0; i < 1000; i++) - { - mem[i] = i; - } - - var arr = new ArraySlice(mem); - var r = arr.Slice(50, 10); - var rr = r.Slice(0, 5); - - r.ToArray().Should().ContainInOrder(Enumerable.Range(50, 10)); - rr.ToArray().Should().ContainInOrder(Enumerable.Range(50, 5)); - } - finally - { - mem.Free(); - } - } - - [Test] - public void AllocateExpand() - { - var mem = new UnmanagedMemoryBlock(10); - - try - { - for (int i = 0; i < 10; i++) - { - mem[i] = i; - } - - mem.Reallocate(15, true); - mem.Count.Should().Be(15); - mem.ToArray().Should().ContainInOrder(Enumerable.Range(0, 10)); - - //assure we can access new 5 items - mem[13].Should().BeOfType(typeof(int)); - } - finally - { - mem.Free(); - } - } - - [Test] - public void AllocateExpandFill() - { - var mem = new UnmanagedMemoryBlock(10); - try - { - for (int i = 0; i < 10; i++) - { - mem[i] = i; - } - - mem.Reallocate(15, -5, true); - mem.Count.Should().Be(15); - mem.ToArray().Should().ContainInOrder(Enumerable.Range(0, 10).Concat(Enumerable.Repeat(-5, 5))); - - //assure we can access new 5 items - mem[13].Should().Be(-5); - } - finally - { - mem.Free(); - } - } - - [Test] - public void AllocateShrinkFill() - { - var mem = new UnmanagedMemoryBlock(10); - try - { - for (int i = 0; i < 10; i++) - { - mem[i] = i; - } - - mem.Reallocate(5, -5, true); - mem.Count.Should().Be(5); - mem.ToArray().Should().ContainInOrder(Enumerable.Range(0, 5)); - mem[3].Should().Be(3); - } - finally - { - mem.Free(); - } - } - - [Test] - public void AllocateShrink() - { - var mem = new UnmanagedMemoryBlock(10); - try - { - for (int i = 0; i < 10; i++) - { - mem[i] = i; - } - - mem.Reallocate(5, true); - mem.Count.Should().Be(5); - mem.ToArray().Should().ContainInOrder(Enumerable.Range(0, 5)); - } - finally - { - mem.Free(); - } - } - - [Test] - public void FromManaged() - { - var arr = Enumerable.Range(0, 10).ToArray(); - var mem = UnmanagedMemoryBlock.FromArray(arr); - try - { - for (int i = 0; i < 10; i++) - { - mem[i].Should().Be(i); - } - - arr[1] = 5; - mem[1].Should().Be(5); - } - finally - { - mem.Free(); - } - } - - [Test] - public void FromManaged_Copy() - { - var arr = Enumerable.Range(0, 10).ToArray(); - var mem = UnmanagedMemoryBlock.FromArray(arr, copy: true); - try - { - for (int i = 0; i < 10; i++) - { - mem[i].Should().Be(i); - } - - arr[1] = 5; - mem[1].Should().NotBe(5); - } - finally - { - mem.Free(); - } - } - - - [Test] - public void Cast() - { - var arr = UnmanagedMemoryBlock.FromArray(Enumerable.Range(0, 10).ToArray()); - - UnmanagedMemoryBlock cast = new UnmanagedMemoryBlock(); - try - { - cast = (UnmanagedMemoryBlock)UnmanagedMemoryBlock.CastTo(arr); - cast.Should().AllBeOfType().And.BeInAscendingOrder(); - } - finally - { - arr.Free(); - cast.Free(); - } - } - - [Test] - public unsafe void Wrap() - { - var mem = np.arange(100).astype(NPTypeCode.Double); - - var addr = mem.Address; - var count = mem.size; - var wrapped = ArraySlice.Wrap(addr, count); - for (int i = 0; i < 100; i++) - { - wrapped[i].Should().Be(i); - } - } - - [Test] - public unsafe void Wrap_Case2() - { - var mem = np.arange(100).astype(NPTypeCode.Double); - - var addr = (double*) mem.Address; - var count = mem.size; - var wrapped = ArraySlice.Wrap(addr, count); - for (int i = 0; i < 100; i++) - { - wrapped[i].Should().Be(i); - } - } - } -} diff --git a/test/NumSharp.UnitTest/NumSharp.UnitTest.csproj b/test/NumSharp.UnitTest/NumSharp.UnitTest.csproj index ab895134..18effd2d 100644 --- a/test/NumSharp.UnitTest/NumSharp.UnitTest.csproj +++ b/test/NumSharp.UnitTest/NumSharp.UnitTest.csproj @@ -1,79 +1,79 @@ - - - - - - net10.0 - Exe - false - true - latest - AnyCPU - Open.snk - Debug;Release;Publish - false - - - - - true - true - SIGNING - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - PreserveNewest - - - - - - - - - - - - - - - Never - - - Never - - - Never - - - Never - - - + + + + + + net10.0 + Exe + false + true + latest + AnyCPU + Open.snk + Debug;Release;Publish + false + + + + + true + true + SIGNING + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PreserveNewest + + + + + + + + + + + + + + + Never + + + Never + + + Never + + + Never + + + From c1c2c7c2f1c1a53e8aa74f8d40834a13df7e0a0f Mon Sep 17 00:00:00 2001 From: Eli Belash Date: Sat, 21 Feb 2026 15:16:03 +0200 Subject: [PATCH 10/15] chore: add .gitattributes for consistent line endings Normalize all text files to LF in the repository to prevent CRLF/LF inconsistencies between Windows and WSL development. Co-Authored-By: Claude Opus 4.6 --- .gitattributes | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..0299793d --- /dev/null +++ b/.gitattributes @@ -0,0 +1,36 @@ +# Auto detect text files and normalize to LF in repo +* text=auto eol=lf + +# Explicit text files +*.cs text eol=lf +*.csproj text eol=lf +*.sln text eol=lf +*.md text eol=lf +*.json text eol=lf +*.xml text eol=lf +*.yml text eol=lf +*.yaml text eol=lf +*.txt text eol=lf +*.sh text eol=lf +*.ps1 text eol=lf +*.py text eol=lf +*.config text eol=lf +*.props text eol=lf +*.targets text eol=lf +*.editorconfig text eol=lf +*.gitignore text eol=lf +*.gitattributes text eol=lf + +# Binary files +*.png binary +*.jpg binary +*.jpeg binary +*.gif binary +*.ico binary +*.snk binary +*.npy binary +*.npz binary +*.dll binary +*.exe binary +*.pdb binary +*.zip binary From d555f0820a39d9eeae47fa3e4b3d0e1a6b187cb7 Mon Sep 17 00:00:00 2001 From: Eli Belash Date: Sat, 21 Feb 2026 15:17:25 +0200 Subject: [PATCH 11/15] chore: normalize line endings to LF MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Apply .gitattributes normalization across all text files. No code changes - only CRLF → LF conversion. Co-Authored-By: Claude Opus 4.6 --- .../Allocation/AllocationMicroBenchmarks.cs | 166 ++-- .../Allocation/AllocationSizeBenchmarks.cs | 136 +-- .../NumSharpAllocationBenchmarks.cs | 222 ++--- .../Allocation/ZeroInitBenchmarks.cs | 218 ++--- ...070-let-more-people-know-about-numsharp.md | 246 +++--- .../issue-0075-implement-numpy.asarray.md | 38 +- .../issue-0078-implement-numpy.where.md | 38 +- .../issue-0095-extend-the-guidelines.md | 118 +-- .../issues/issue-0105-implement-numpy.vdot.md | 42 +- .../issue-0106-implement-numpy.inner.md | 30 +- .../issue-0108-implement-numpy.tensordot.md | 30 +- .../issue-0114-implement-numpy.fft.fft.md | 26 +- ...ssue-0116-intel-math-kernel-library-mkl.md | 640 +++++++------- ...or-all-classes-what-class-has-what-task.md | 184 ++-- .../issue-0190-compressed-sparse-format.md | 70 +- docs/issues/issue-0202-implement-np.pad.md | 48 +- docs/issues/issue-0210-add-numpy.all.md | 40 +- .../issue-0211-implement-scipy-interpolate.md | 64 +- docs/issues/issue-0220-numpy.flip.md | 40 +- ...nice-column-and-row-access-i.e-matrix-2.md | 796 +++++++++--------- docs/issues/issue-0239-np.linalg.norm.md | 98 +-- ...ules-and-library-structure-architecture.md | 166 ++-- ...ssue-0298-implement-numpy.random.choice.md | 192 ++--- ...315-tostring-should-truncate-its-output.md | 76 +- docs/issues/issue-0326-lazy-loading.md | 244 +++--- docs/issues/issue-0340-memory-limitations.md | 62 +- .../issue-0341-ndarray-string-problem.md | 56 +- ...system.drawing.image-and-bitmap-methods.md | 88 +- docs/issues/issue-0349-scipy.signal.md | 176 ++-- ...oper-way-to-iterate-using-ienumerable-t.md | 30 +- docs/issues/issue-0360-np.any.md | 42 +- ...61-mixing-indices-and-slices-in-ndarray.md | 198 ++--- .../issue-0362-implicit-operators-for.md | 86 +- ...overload-with-support-for-specific-axis.md | 34 +- docs/issues/issue-0365-np.nonzero.md | 28 +- docs/issues/issue-0366-masking-ndarray-nd.md | 46 +- ...e-0368-masking-a-slice-...-returns-null.md | 90 +- ...ssue-0369-slicing-notsupportedexception.md | 30 +- docs/issues/issue-0372-clustering-example.md | 48 +- docs/issues/issue-0374-np.append.md | 38 +- docs/issues/issue-0375-slice-assignment.md | 44 +- docs/issues/issue-0378-add-np.frombuffer.md | 28 +- ...nvert-numsharp.ndarray-to-numpy.ndarray.md | 180 ++-- .../issue-0384-save-ndarray-as-png-image.md | 86 +- ...386-how-to-read-.csv-file-with-numsharp.md | 36 +- ...-an-ndarray-from-pointer-and-nptypecode.md | 104 +-- ...tondarray-problem-with-odd-bitmap-width.md | 80 +- docs/issues/issue-0397-missing-np.tile.md | 124 +-- ...0398-typo-in-library-np.random.stardard.md | 32 +- ...sue-0401-how-to-convert-ndarray-to-list.md | 180 ++-- ...ue-0405-np.argsort-not-sorting-properly.md | 64 +- .../issue-0406-c-convert-image-to-ndarray.md | 38 +- .../issue-0407-np.negative-is-not-working.md | 64 +- ...-a-hidden-error-returning-wrong-results.md | 110 +-- ...exoutofrangeexception-for-jagged-arrays.md | 74 +- docs/issues/issue-0411-pyobject-to-ndarray.md | 28 +- ...umsharp.core-version-0.20.5.0-and-numsh.md | 36 +- docs/issues/issue-0413-ndarray-split.md | 62 +- ...414-implementation-of-np.delete-working.md | 26 +- ...ake-numsharp.ndarray-from-numpy.ndarray.md | 52 +- docs/issues/issue-0418-help-me.md | 50 +- docs/issues/issue-0421-performance.md | 156 ++-- ...0422-index-of-element-with-a-condiction.md | 34 +- ...-somearray-np.frombuffer-bytebuffer.toa.md | 88 +- ...uld-not-be-found-are-you-missing-a-usin.md | 72 +- ...-0426-arctan2-returning-incorrect-value.md | 94 +-- .../issue-0427-performance-on-np.matmul.md | 88 +- ...typo-in-ndarray.tomuliarray-method-name.md | 24 +- ...agedmemoryblock1-fails-on-mono-on-linux.md | 58 +- ...rsion-0.20.5.0-and-numsharp.lite-versio.md | 116 +-- ...indexes-using-ndarray-ndarray-and-setti.md | 78 +- .../issue-0435-complex-number-support.md | 86 +- .../issue-0436-np.searchsorted-error.md | 34 +- ...-0437-argmin-is-not-the-same-with-numpy.md | 24 +- ...8-how-to-get-the-inverse-of-a-2d-matrix.md | 24 +- .../issue-0439-where-is-np.where-function.md | 28 +- ...itical-issue-with-24bpp-vertical-images.md | 54 +- ...portedexception-on-negate-function-call.md | 46 +- ...-0445-how-can-provide-output-for-np.dot.md | 26 +- ...e-to-specified-method-unsupported-error.md | 122 +-- ...umsharp0.20.5-but-not-on-numsharp0.30.0.md | 176 ++-- ...causes-tests-to-stop-the-entire-process.md | 40 +- ...mplemented-and-allclose-test-is-ignored.md | 48 +- docs/issues/issue-0451-np.argmax-is-slow.md | 24 +- ...nd-method-is-missing-decimals-parameter.md | 26 +- .../issue-0454-ndarray.lstqr-doesnt-work.md | 26 +- ...ot-allow-building-with-il2cpp-via-unity.md | 42 +- ...t-casting-singleton-array-to-value-type.md | 80 +- ...ctly-saves-system.byte-arrays-as-signed.md | 54 +- ...se-the-repo-to-convert-some-python-code.md | 116 +-- ...pi-request-to-port-np.random.triangular.md | 28 +- ...p.ndarray-with-tensorflow.numpy.ndarray.md | 36 +- ...66-bug-np.random.choice-raise-exception.md | 104 +-- ...ktop-but-fails-on-cloud-web-service-.ne.md | 76 +- ...e-0468-np-array.convolve-returning-null.md | 400 ++++----- ...m.choice-method-missing-cause-exception.md | 46 +- ...exception-specified-method-is-not-suppo.md | 32 +- ...late-the-rank-of-a-matrix-with-numsharp.md | 30 +- .../issues/issue-0473-bit-shift-and-bit-or.md | 30 +- ...ontiguous-because-of-broadcast-mismatch.md | 24 +- ...p.core-contains-many-debug.assert-lines.md | 28 +- ...py-and-numsharp-with-np.matmul-function.md | 82 +- ...sue-0479-lacking-outdated-documentation.md | 38 +- ...0-numsharp-equivalent-for-unravel-index.md | 36 +- ...e-0481-normal-disttribution-in-numsharp.md | 26 +- ...-how-to-convert-list-ndarray-to-ndarray.md | 40 +- .../issue-0484-np.load-system.exception.md | 36 +- docs/issues/issue-0486-slice-assign.md | 50 +- ...at-while-other-functions-as-type-double.md | 48 +- ...ice-raised-system.notsupportedexception.md | 64 +- ...-with-replace-false-produces-duplicates.md | 24 +- .../issue-0491-tobitmap-datatype-mistmatch.md | 38 +- ...-version-5.0.2-of-system.drawing.common.md | 28 +- ...net-interactive-notebooks-is-misleading.md | 24 +- ...arp-stopped-development-and-maintenance.md | 44 +- ...issue-0497-np.linalg.pinv-not-supported.md | 44 +- ...xample-on-how-to-use-it-with-ironpython.md | 48 +- ...issue-0499-possible-typo-tomulidimarray.md | 38 +- docs/issues/issue-0501-memory-leak.md | 124 +-- ...-0505-np.convolve-return-null-exception.md | 44 +- ...0506-cannot-create-an-ndarray-of-shorts.md | 24 +- docs/issues/issue-0507-np.maximum-error.md | 374 ++++---- ....hstack-has-diffrent-effect-from-python.md | 100 +-- ...xtremely-poor-performance-on-sum-reduce.md | 170 ++-- ...-save-a-nested-dictionary-with-save-npz.md | 50 +- ...p-work-in-unity-with-the-il2cpp-backend.md | 26 +- ...l.onnxruntime.tensors.densetensor-float.md | 50 +- ...14-setitem-for-multiple-ids-not-working.md | 80 +- ...g-a-.npy-file-containing-a-scalar-value.md | 24 +- ...array-ori-array-max-prob-conf-threshold.md | 32 +- src/NumSharp.Core/NumSharp.Core.csproj | 174 ++-- .../NumSharp.Benchmark.csproj | 64 +- .../NumSharp.UnitTest.csproj | 158 ++-- 133 files changed, 5719 insertions(+), 5719 deletions(-) diff --git a/benchmark/NumSharp.Benchmark.GraphEngine/Benchmarks/Allocation/AllocationMicroBenchmarks.cs b/benchmark/NumSharp.Benchmark.GraphEngine/Benchmarks/Allocation/AllocationMicroBenchmarks.cs index b1643bac..e91e45b6 100644 --- a/benchmark/NumSharp.Benchmark.GraphEngine/Benchmarks/Allocation/AllocationMicroBenchmarks.cs +++ b/benchmark/NumSharp.Benchmark.GraphEngine/Benchmarks/Allocation/AllocationMicroBenchmarks.cs @@ -1,83 +1,83 @@ -using System.Runtime.InteropServices; -using BenchmarkDotNet.Attributes; -using NumSharp.Benchmark.GraphEngine.Infrastructure; - -namespace NumSharp.Benchmark.GraphEngine.Benchmarks.Allocation; - -/// -/// Micro-benchmarks comparing allocation primitives: -/// - Marshal.AllocHGlobal (current) -/// - NativeMemory.Alloc (proposed) -/// - NativeMemory.AlignedAlloc (for SIMD) -/// -/// These benchmarks inform issue #528: NativeMemory modernization. -/// -[BenchmarkCategory("Allocation", "Micro")] -public class AllocationMicroBenchmarks : BenchmarkBase -{ - /// - /// Byte counts to allocate (matching typical NumSharp array sizes). - /// - [Params(64, 1_000, 100_000, 10_000_000)] - public int Bytes { get; set; } - - // ======================================================================== - // Allocation Only (no free) - measures allocation overhead - // ======================================================================== - - [Benchmark(Baseline = true, Description = "Marshal.AllocHGlobal")] - [BenchmarkCategory("AllocOnly")] - public nint MarshalAllocHGlobal() => Marshal.AllocHGlobal(Bytes); - - [Benchmark(Description = "NativeMemory.Alloc")] - [BenchmarkCategory("AllocOnly")] - public unsafe void* NativeMemoryAlloc() => NativeMemory.Alloc((nuint)Bytes); - - [Benchmark(Description = "NativeMemory.AlignedAlloc(32)")] - [BenchmarkCategory("AllocOnly")] - public unsafe void* NativeMemoryAlignedAlloc32() => NativeMemory.AlignedAlloc((nuint)Bytes, 32); - - [Benchmark(Description = "NativeMemory.AlignedAlloc(64)")] - [BenchmarkCategory("AllocOnly")] - public unsafe void* NativeMemoryAlignedAlloc64() => NativeMemory.AlignedAlloc((nuint)Bytes, 64); - - [Benchmark(Description = "NativeMemory.AllocZeroed")] - [BenchmarkCategory("AllocOnly")] - public unsafe void* NativeMemoryAllocZeroed() => NativeMemory.AllocZeroed((nuint)Bytes); - - // ======================================================================== - // Round-Trip (alloc + free) - measures full lifecycle - // ======================================================================== - - [Benchmark(Description = "Marshal alloc+free")] - [BenchmarkCategory("RoundTrip")] - public void MarshalRoundTrip() - { - var ptr = Marshal.AllocHGlobal(Bytes); - Marshal.FreeHGlobal(ptr); - } - - [Benchmark(Description = "NativeMemory alloc+free")] - [BenchmarkCategory("RoundTrip")] - public unsafe void NativeMemoryRoundTrip() - { - var ptr = NativeMemory.Alloc((nuint)Bytes); - NativeMemory.Free(ptr); - } - - [Benchmark(Description = "NativeMemory aligned alloc+free")] - [BenchmarkCategory("RoundTrip")] - public unsafe void NativeMemoryAlignedRoundTrip() - { - var ptr = NativeMemory.AlignedAlloc((nuint)Bytes, 32); - NativeMemory.AlignedFree(ptr); - } - - [Benchmark(Description = "NativeMemory zeroed alloc+free")] - [BenchmarkCategory("RoundTrip")] - public unsafe void NativeMemoryZeroedRoundTrip() - { - var ptr = NativeMemory.AllocZeroed((nuint)Bytes); - NativeMemory.Free(ptr); - } -} +using System.Runtime.InteropServices; +using BenchmarkDotNet.Attributes; +using NumSharp.Benchmark.GraphEngine.Infrastructure; + +namespace NumSharp.Benchmark.GraphEngine.Benchmarks.Allocation; + +/// +/// Micro-benchmarks comparing allocation primitives: +/// - Marshal.AllocHGlobal (current) +/// - NativeMemory.Alloc (proposed) +/// - NativeMemory.AlignedAlloc (for SIMD) +/// +/// These benchmarks inform issue #528: NativeMemory modernization. +/// +[BenchmarkCategory("Allocation", "Micro")] +public class AllocationMicroBenchmarks : BenchmarkBase +{ + /// + /// Byte counts to allocate (matching typical NumSharp array sizes). + /// + [Params(64, 1_000, 100_000, 10_000_000)] + public int Bytes { get; set; } + + // ======================================================================== + // Allocation Only (no free) - measures allocation overhead + // ======================================================================== + + [Benchmark(Baseline = true, Description = "Marshal.AllocHGlobal")] + [BenchmarkCategory("AllocOnly")] + public nint MarshalAllocHGlobal() => Marshal.AllocHGlobal(Bytes); + + [Benchmark(Description = "NativeMemory.Alloc")] + [BenchmarkCategory("AllocOnly")] + public unsafe void* NativeMemoryAlloc() => NativeMemory.Alloc((nuint)Bytes); + + [Benchmark(Description = "NativeMemory.AlignedAlloc(32)")] + [BenchmarkCategory("AllocOnly")] + public unsafe void* NativeMemoryAlignedAlloc32() => NativeMemory.AlignedAlloc((nuint)Bytes, 32); + + [Benchmark(Description = "NativeMemory.AlignedAlloc(64)")] + [BenchmarkCategory("AllocOnly")] + public unsafe void* NativeMemoryAlignedAlloc64() => NativeMemory.AlignedAlloc((nuint)Bytes, 64); + + [Benchmark(Description = "NativeMemory.AllocZeroed")] + [BenchmarkCategory("AllocOnly")] + public unsafe void* NativeMemoryAllocZeroed() => NativeMemory.AllocZeroed((nuint)Bytes); + + // ======================================================================== + // Round-Trip (alloc + free) - measures full lifecycle + // ======================================================================== + + [Benchmark(Description = "Marshal alloc+free")] + [BenchmarkCategory("RoundTrip")] + public void MarshalRoundTrip() + { + var ptr = Marshal.AllocHGlobal(Bytes); + Marshal.FreeHGlobal(ptr); + } + + [Benchmark(Description = "NativeMemory alloc+free")] + [BenchmarkCategory("RoundTrip")] + public unsafe void NativeMemoryRoundTrip() + { + var ptr = NativeMemory.Alloc((nuint)Bytes); + NativeMemory.Free(ptr); + } + + [Benchmark(Description = "NativeMemory aligned alloc+free")] + [BenchmarkCategory("RoundTrip")] + public unsafe void NativeMemoryAlignedRoundTrip() + { + var ptr = NativeMemory.AlignedAlloc((nuint)Bytes, 32); + NativeMemory.AlignedFree(ptr); + } + + [Benchmark(Description = "NativeMemory zeroed alloc+free")] + [BenchmarkCategory("RoundTrip")] + public unsafe void NativeMemoryZeroedRoundTrip() + { + var ptr = NativeMemory.AllocZeroed((nuint)Bytes); + NativeMemory.Free(ptr); + } +} diff --git a/benchmark/NumSharp.Benchmark.GraphEngine/Benchmarks/Allocation/AllocationSizeBenchmarks.cs b/benchmark/NumSharp.Benchmark.GraphEngine/Benchmarks/Allocation/AllocationSizeBenchmarks.cs index b6f48131..a6a0d74c 100644 --- a/benchmark/NumSharp.Benchmark.GraphEngine/Benchmarks/Allocation/AllocationSizeBenchmarks.cs +++ b/benchmark/NumSharp.Benchmark.GraphEngine/Benchmarks/Allocation/AllocationSizeBenchmarks.cs @@ -1,68 +1,68 @@ -using System.Runtime.InteropServices; -using BenchmarkDotNet.Attributes; -using NumSharp.Benchmark.GraphEngine.Infrastructure; - -namespace NumSharp.Benchmark.GraphEngine.Benchmarks.Allocation; - -/// -/// Benchmarks allocation performance across a wide range of sizes. -/// Helps identify: -/// - Small allocation overhead (where dispatch cost dominates) -/// - Crossover points between allocation strategies -/// - Large allocation behavior (OS page allocation) -/// -[BenchmarkCategory("Allocation", "SizeScaling")] -public class AllocationSizeBenchmarks : BenchmarkBase -{ - /// - /// Byte counts covering common array sizes: - /// - 64B: Single cache line - /// - 256B: Small scalar arrays - /// - 1KB: Tiny arrays - /// - 4KB: Page size boundary - /// - 64KB: L1 cache size - /// - 256KB: L2 cache size - /// - 1MB: L3 cache boundary - /// - 4MB: Large arrays - /// - 16MB: Very large arrays - /// - 64MB: Memory-bound - /// - [Params(64, 256, 1024, 4096, 65536, 262144, 1048576, 4194304, 16777216, 67108864)] - public int Bytes { get; set; } - - // ======================================================================== - // Marshal vs NativeMemory comparison across sizes - // ======================================================================== - - [Benchmark(Baseline = true, Description = "Marshal.AllocHGlobal")] - [BenchmarkCategory("Compare")] - public void MarshalAlloc() - { - var ptr = Marshal.AllocHGlobal(Bytes); - Marshal.FreeHGlobal(ptr); - } - - [Benchmark(Description = "NativeMemory.Alloc")] - [BenchmarkCategory("Compare")] - public unsafe void NativeAlloc() - { - var ptr = NativeMemory.Alloc((nuint)Bytes); - NativeMemory.Free(ptr); - } - - [Benchmark(Description = "NativeMemory.AlignedAlloc(32)")] - [BenchmarkCategory("Compare")] - public unsafe void NativeAlignedAlloc() - { - var ptr = NativeMemory.AlignedAlloc((nuint)Bytes, 32); - NativeMemory.AlignedFree(ptr); - } - - [Benchmark(Description = "NativeMemory.AllocZeroed")] - [BenchmarkCategory("Compare")] - public unsafe void NativeAllocZeroed() - { - var ptr = NativeMemory.AllocZeroed((nuint)Bytes); - NativeMemory.Free(ptr); - } -} +using System.Runtime.InteropServices; +using BenchmarkDotNet.Attributes; +using NumSharp.Benchmark.GraphEngine.Infrastructure; + +namespace NumSharp.Benchmark.GraphEngine.Benchmarks.Allocation; + +/// +/// Benchmarks allocation performance across a wide range of sizes. +/// Helps identify: +/// - Small allocation overhead (where dispatch cost dominates) +/// - Crossover points between allocation strategies +/// - Large allocation behavior (OS page allocation) +/// +[BenchmarkCategory("Allocation", "SizeScaling")] +public class AllocationSizeBenchmarks : BenchmarkBase +{ + /// + /// Byte counts covering common array sizes: + /// - 64B: Single cache line + /// - 256B: Small scalar arrays + /// - 1KB: Tiny arrays + /// - 4KB: Page size boundary + /// - 64KB: L1 cache size + /// - 256KB: L2 cache size + /// - 1MB: L3 cache boundary + /// - 4MB: Large arrays + /// - 16MB: Very large arrays + /// - 64MB: Memory-bound + /// + [Params(64, 256, 1024, 4096, 65536, 262144, 1048576, 4194304, 16777216, 67108864)] + public int Bytes { get; set; } + + // ======================================================================== + // Marshal vs NativeMemory comparison across sizes + // ======================================================================== + + [Benchmark(Baseline = true, Description = "Marshal.AllocHGlobal")] + [BenchmarkCategory("Compare")] + public void MarshalAlloc() + { + var ptr = Marshal.AllocHGlobal(Bytes); + Marshal.FreeHGlobal(ptr); + } + + [Benchmark(Description = "NativeMemory.Alloc")] + [BenchmarkCategory("Compare")] + public unsafe void NativeAlloc() + { + var ptr = NativeMemory.Alloc((nuint)Bytes); + NativeMemory.Free(ptr); + } + + [Benchmark(Description = "NativeMemory.AlignedAlloc(32)")] + [BenchmarkCategory("Compare")] + public unsafe void NativeAlignedAlloc() + { + var ptr = NativeMemory.AlignedAlloc((nuint)Bytes, 32); + NativeMemory.AlignedFree(ptr); + } + + [Benchmark(Description = "NativeMemory.AllocZeroed")] + [BenchmarkCategory("Compare")] + public unsafe void NativeAllocZeroed() + { + var ptr = NativeMemory.AllocZeroed((nuint)Bytes); + NativeMemory.Free(ptr); + } +} diff --git a/benchmark/NumSharp.Benchmark.GraphEngine/Benchmarks/Allocation/NumSharpAllocationBenchmarks.cs b/benchmark/NumSharp.Benchmark.GraphEngine/Benchmarks/Allocation/NumSharpAllocationBenchmarks.cs index 0cfdd56a..c6f421ff 100644 --- a/benchmark/NumSharp.Benchmark.GraphEngine/Benchmarks/Allocation/NumSharpAllocationBenchmarks.cs +++ b/benchmark/NumSharp.Benchmark.GraphEngine/Benchmarks/Allocation/NumSharpAllocationBenchmarks.cs @@ -1,111 +1,111 @@ -using BenchmarkDotNet.Attributes; -using NumSharp; -using NumSharp.Benchmark.GraphEngine.Infrastructure; - -namespace NumSharp.Benchmark.GraphEngine.Benchmarks.Allocation; - -/// -/// End-to-end NumSharp benchmarks measuring allocation impact: -/// - Array creation functions that allocate memory -/// - Operations that allocate output arrays -/// -/// These complement the micro-benchmarks by showing real-world impact. -/// -[BenchmarkCategory("Allocation", "NumSharp")] -public class NumSharpAllocationBenchmarks : TypedBenchmarkBase -{ - [Params(ArraySizeSource.Small, ArraySizeSource.Medium, ArraySizeSource.Large)] - public override int N { get; set; } - - [ParamsSource(nameof(Types))] - public new NPTypeCode DType { get; set; } - - /// - /// Types to benchmark. Focus on common types to keep benchmark time reasonable. - /// - public static IEnumerable Types => TypeParameterSource.MinimalTypes; - - private NDArray _a = null!; - private NDArray _b = null!; - - [GlobalSetup] - public void Setup() - { - _a = CreateRandomArray(N, DType, Seed); - _b = CreateRandomArray(N, DType, Seed + 1); - } - - [GlobalCleanup] - public void Cleanup() - { - _a = null!; - _b = null!; - GC.Collect(); - } - - // ======================================================================== - // Array Creation - Uninitialized - // ======================================================================== - - [Benchmark(Description = "np.empty(N) - uninitialized")] - [BenchmarkCategory("Creation", "Uninitialized")] - public NDArray Empty() => np.empty(new Shape(N), DType); - - // ======================================================================== - // Array Creation - Zero-Initialized - // This is the target for AllocZeroed optimization - // ======================================================================== - - [Benchmark(Description = "np.zeros(N) - zero-initialized")] - [BenchmarkCategory("Creation", "ZeroInit")] - public NDArray Zeros() => np.zeros(new Shape(N), DType); - - // ======================================================================== - // Array Creation - Value-Initialized - // ======================================================================== - - [Benchmark(Description = "np.ones(N) - ones")] - [BenchmarkCategory("Creation", "ValueInit")] - public NDArray Ones() => np.ones(new Shape(N), DType); - - [Benchmark(Description = "np.full(N, 42) - fill value")] - [BenchmarkCategory("Creation", "ValueInit")] - public NDArray Full() => np.full(new Shape(N), 42, DType); - - // ======================================================================== - // Array Creation - Sequential - // ======================================================================== - - [Benchmark(Description = "np.arange(N) - sequential")] - [BenchmarkCategory("Creation", "Sequential")] - public NDArray Arange() => np.arange(N); - - // ======================================================================== - // Operations That Allocate Output - // Shows allocation overhead in computation context - // ======================================================================== - - [Benchmark(Description = "a + b - binary op output alloc")] - [BenchmarkCategory("Operation", "Binary")] - public NDArray Add() => _a + _b; - - [Benchmark(Description = "a * b - binary op output alloc")] - [BenchmarkCategory("Operation", "Binary")] - public NDArray Multiply() => _a * _b; - - [Benchmark(Description = "np.sqrt(a) - unary op output alloc")] - [BenchmarkCategory("Operation", "Unary")] - public NDArray Sqrt() => np.sqrt(_a.astype(np.float64)); - - // ======================================================================== - // Copy Operations - // ======================================================================== - - [Benchmark(Description = "np.copy(a) - explicit copy")] - [BenchmarkCategory("Copy")] - public NDArray Copy() => np.copy(_a); - - [Benchmark(Description = "a.copy() - method copy")] - [BenchmarkCategory("Copy")] - public NDArray CopyMethod() => _a.copy(); -} +using BenchmarkDotNet.Attributes; +using NumSharp; +using NumSharp.Benchmark.GraphEngine.Infrastructure; + +namespace NumSharp.Benchmark.GraphEngine.Benchmarks.Allocation; + +/// +/// End-to-end NumSharp benchmarks measuring allocation impact: +/// - Array creation functions that allocate memory +/// - Operations that allocate output arrays +/// +/// These complement the micro-benchmarks by showing real-world impact. +/// +[BenchmarkCategory("Allocation", "NumSharp")] +public class NumSharpAllocationBenchmarks : TypedBenchmarkBase +{ + [Params(ArraySizeSource.Small, ArraySizeSource.Medium, ArraySizeSource.Large)] + public override int N { get; set; } + + [ParamsSource(nameof(Types))] + public new NPTypeCode DType { get; set; } + + /// + /// Types to benchmark. Focus on common types to keep benchmark time reasonable. + /// + public static IEnumerable Types => TypeParameterSource.MinimalTypes; + + private NDArray _a = null!; + private NDArray _b = null!; + + [GlobalSetup] + public void Setup() + { + _a = CreateRandomArray(N, DType, Seed); + _b = CreateRandomArray(N, DType, Seed + 1); + } + + [GlobalCleanup] + public void Cleanup() + { + _a = null!; + _b = null!; + GC.Collect(); + } + + // ======================================================================== + // Array Creation - Uninitialized + // ======================================================================== + + [Benchmark(Description = "np.empty(N) - uninitialized")] + [BenchmarkCategory("Creation", "Uninitialized")] + public NDArray Empty() => np.empty(new Shape(N), DType); + + // ======================================================================== + // Array Creation - Zero-Initialized + // This is the target for AllocZeroed optimization + // ======================================================================== + + [Benchmark(Description = "np.zeros(N) - zero-initialized")] + [BenchmarkCategory("Creation", "ZeroInit")] + public NDArray Zeros() => np.zeros(new Shape(N), DType); + + // ======================================================================== + // Array Creation - Value-Initialized + // ======================================================================== + + [Benchmark(Description = "np.ones(N) - ones")] + [BenchmarkCategory("Creation", "ValueInit")] + public NDArray Ones() => np.ones(new Shape(N), DType); + + [Benchmark(Description = "np.full(N, 42) - fill value")] + [BenchmarkCategory("Creation", "ValueInit")] + public NDArray Full() => np.full(new Shape(N), 42, DType); + + // ======================================================================== + // Array Creation - Sequential + // ======================================================================== + + [Benchmark(Description = "np.arange(N) - sequential")] + [BenchmarkCategory("Creation", "Sequential")] + public NDArray Arange() => np.arange(N); + + // ======================================================================== + // Operations That Allocate Output + // Shows allocation overhead in computation context + // ======================================================================== + + [Benchmark(Description = "a + b - binary op output alloc")] + [BenchmarkCategory("Operation", "Binary")] + public NDArray Add() => _a + _b; + + [Benchmark(Description = "a * b - binary op output alloc")] + [BenchmarkCategory("Operation", "Binary")] + public NDArray Multiply() => _a * _b; + + [Benchmark(Description = "np.sqrt(a) - unary op output alloc")] + [BenchmarkCategory("Operation", "Unary")] + public NDArray Sqrt() => np.sqrt(_a.astype(np.float64)); + + // ======================================================================== + // Copy Operations + // ======================================================================== + + [Benchmark(Description = "np.copy(a) - explicit copy")] + [BenchmarkCategory("Copy")] + public NDArray Copy() => np.copy(_a); + + [Benchmark(Description = "a.copy() - method copy")] + [BenchmarkCategory("Copy")] + public NDArray CopyMethod() => _a.copy(); +} diff --git a/benchmark/NumSharp.Benchmark.GraphEngine/Benchmarks/Allocation/ZeroInitBenchmarks.cs b/benchmark/NumSharp.Benchmark.GraphEngine/Benchmarks/Allocation/ZeroInitBenchmarks.cs index c37f067b..88100f96 100644 --- a/benchmark/NumSharp.Benchmark.GraphEngine/Benchmarks/Allocation/ZeroInitBenchmarks.cs +++ b/benchmark/NumSharp.Benchmark.GraphEngine/Benchmarks/Allocation/ZeroInitBenchmarks.cs @@ -1,109 +1,109 @@ -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using BenchmarkDotNet.Attributes; -using NumSharp.Benchmark.GraphEngine.Infrastructure; - -namespace NumSharp.Benchmark.GraphEngine.Benchmarks.Allocation; - -/// -/// Benchmarks comparing zero-initialization approaches for np.zeros: -/// - Current: Alloc + Unsafe.InitBlock -/// - Proposed: NativeMemory.AllocZeroed (OS may have fast paths) -/// - Alternative: Alloc + Span.Clear -/// -/// These benchmarks inform the np.zeros optimization decision in issue #528. -/// -[BenchmarkCategory("Allocation", "ZeroInit")] -public class ZeroInitBenchmarks : BenchmarkBase -{ - /// - /// Element counts (int32 = 4 bytes each). - /// Small: 4KB, Medium: 400KB, Large: 40MB - /// - [Params(1_000, 100_000, 10_000_000)] - public override int N { get; set; } - - private int _bytes; - - [GlobalSetup] - public void Setup() - { - _bytes = N * sizeof(int); - } - - // ======================================================================== - // Current NumSharp approach: Alloc + Unsafe.InitBlock - // Used in UnmanagedMemoryBlock when filling with zeros - // ======================================================================== - - [Benchmark(Baseline = true, Description = "Alloc + InitBlock (current)")] - [BenchmarkCategory("ZeroInit")] - public unsafe void AllocThenInitBlock() - { - var ptr = NativeMemory.Alloc((nuint)_bytes); - Unsafe.InitBlock(ptr, 0, (uint)_bytes); - NativeMemory.Free(ptr); - } - - // ======================================================================== - // Proposed: NativeMemory.AllocZeroed - // OS may use page zeroing, copy-on-write, or hardware optimizations - // ======================================================================== - - [Benchmark(Description = "AllocZeroed (proposed)")] - [BenchmarkCategory("ZeroInit")] - public unsafe void AllocZeroed() - { - var ptr = NativeMemory.AllocZeroed((nuint)_bytes); - NativeMemory.Free(ptr); - } - - // ======================================================================== - // Alternative: Alloc + Span.Clear - // Span.Clear may use SIMD internally - // ======================================================================== - - [Benchmark(Description = "Alloc + Span.Clear")] - [BenchmarkCategory("ZeroInit")] - public unsafe void AllocThenSpanClear() - { - var ptr = NativeMemory.Alloc((nuint)_bytes); - new Span(ptr, _bytes).Clear(); - NativeMemory.Free(ptr); - } - - // ======================================================================== - // Aligned variants - test if alignment helps zero-init - // ======================================================================== - - [Benchmark(Description = "AlignedAlloc(32) + InitBlock")] - [BenchmarkCategory("ZeroInit", "Aligned")] - public unsafe void AlignedAllocThenInitBlock() - { - var ptr = NativeMemory.AlignedAlloc((nuint)_bytes, 32); - Unsafe.InitBlock(ptr, 0, (uint)_bytes); - NativeMemory.AlignedFree(ptr); - } - - [Benchmark(Description = "AlignedAlloc(32) + Span.Clear")] - [BenchmarkCategory("ZeroInit", "Aligned")] - public unsafe void AlignedAllocThenSpanClear() - { - var ptr = NativeMemory.AlignedAlloc((nuint)_bytes, 32); - new Span(ptr, _bytes).Clear(); - NativeMemory.AlignedFree(ptr); - } - - // ======================================================================== - // Marshal.AllocHGlobal baseline for comparison - // ======================================================================== - - [Benchmark(Description = "Marshal.AllocHGlobal + InitBlock")] - [BenchmarkCategory("ZeroInit", "Marshal")] - public unsafe void MarshalAllocThenInitBlock() - { - var ptr = Marshal.AllocHGlobal(_bytes); - Unsafe.InitBlock((void*)ptr, 0, (uint)_bytes); - Marshal.FreeHGlobal(ptr); - } -} +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using BenchmarkDotNet.Attributes; +using NumSharp.Benchmark.GraphEngine.Infrastructure; + +namespace NumSharp.Benchmark.GraphEngine.Benchmarks.Allocation; + +/// +/// Benchmarks comparing zero-initialization approaches for np.zeros: +/// - Current: Alloc + Unsafe.InitBlock +/// - Proposed: NativeMemory.AllocZeroed (OS may have fast paths) +/// - Alternative: Alloc + Span.Clear +/// +/// These benchmarks inform the np.zeros optimization decision in issue #528. +/// +[BenchmarkCategory("Allocation", "ZeroInit")] +public class ZeroInitBenchmarks : BenchmarkBase +{ + /// + /// Element counts (int32 = 4 bytes each). + /// Small: 4KB, Medium: 400KB, Large: 40MB + /// + [Params(1_000, 100_000, 10_000_000)] + public override int N { get; set; } + + private int _bytes; + + [GlobalSetup] + public void Setup() + { + _bytes = N * sizeof(int); + } + + // ======================================================================== + // Current NumSharp approach: Alloc + Unsafe.InitBlock + // Used in UnmanagedMemoryBlock when filling with zeros + // ======================================================================== + + [Benchmark(Baseline = true, Description = "Alloc + InitBlock (current)")] + [BenchmarkCategory("ZeroInit")] + public unsafe void AllocThenInitBlock() + { + var ptr = NativeMemory.Alloc((nuint)_bytes); + Unsafe.InitBlock(ptr, 0, (uint)_bytes); + NativeMemory.Free(ptr); + } + + // ======================================================================== + // Proposed: NativeMemory.AllocZeroed + // OS may use page zeroing, copy-on-write, or hardware optimizations + // ======================================================================== + + [Benchmark(Description = "AllocZeroed (proposed)")] + [BenchmarkCategory("ZeroInit")] + public unsafe void AllocZeroed() + { + var ptr = NativeMemory.AllocZeroed((nuint)_bytes); + NativeMemory.Free(ptr); + } + + // ======================================================================== + // Alternative: Alloc + Span.Clear + // Span.Clear may use SIMD internally + // ======================================================================== + + [Benchmark(Description = "Alloc + Span.Clear")] + [BenchmarkCategory("ZeroInit")] + public unsafe void AllocThenSpanClear() + { + var ptr = NativeMemory.Alloc((nuint)_bytes); + new Span(ptr, _bytes).Clear(); + NativeMemory.Free(ptr); + } + + // ======================================================================== + // Aligned variants - test if alignment helps zero-init + // ======================================================================== + + [Benchmark(Description = "AlignedAlloc(32) + InitBlock")] + [BenchmarkCategory("ZeroInit", "Aligned")] + public unsafe void AlignedAllocThenInitBlock() + { + var ptr = NativeMemory.AlignedAlloc((nuint)_bytes, 32); + Unsafe.InitBlock(ptr, 0, (uint)_bytes); + NativeMemory.AlignedFree(ptr); + } + + [Benchmark(Description = "AlignedAlloc(32) + Span.Clear")] + [BenchmarkCategory("ZeroInit", "Aligned")] + public unsafe void AlignedAllocThenSpanClear() + { + var ptr = NativeMemory.AlignedAlloc((nuint)_bytes, 32); + new Span(ptr, _bytes).Clear(); + NativeMemory.AlignedFree(ptr); + } + + // ======================================================================== + // Marshal.AllocHGlobal baseline for comparison + // ======================================================================== + + [Benchmark(Description = "Marshal.AllocHGlobal + InitBlock")] + [BenchmarkCategory("ZeroInit", "Marshal")] + public unsafe void MarshalAllocThenInitBlock() + { + var ptr = Marshal.AllocHGlobal(_bytes); + Unsafe.InitBlock((void*)ptr, 0, (uint)_bytes); + Marshal.FreeHGlobal(ptr); + } +} diff --git a/docs/issues/issue-0070-let-more-people-know-about-numsharp.md b/docs/issues/issue-0070-let-more-people-know-about-numsharp.md index b4cab28f..bc54d297 100644 --- a/docs/issues/issue-0070-let-more-people-know-about-numsharp.md +++ b/docs/issues/issue-0070-let-more-people-know-about-numsharp.md @@ -1,123 +1,123 @@ -# #70: Let more people know about NumSharp - -- **URL:** https://github.com/SciSharp/NumSharp/issues/70 -- **State:** OPEN -- **Author:** @Oceania2018 -- **Created:** 2018-11-08T03:07:08Z -- **Updated:** 2019-08-06T13:03:10Z -- **Labels:** help wanted - -## Description - -I've written an article [here](https://medium.com/@haiping008/numsharp-numerical-net-7c6ab6edfe27) which introduce NumSharp. - -@dotChris90 Can you start with the [docs](https://numsharp.readthedocs.io). - -## Comments - -### Comment 1 by @dotChris90 (2018-11-08T06:24:14Z) - -Would start maybe at weekends. Next 2 days have little bit more work to do. :) - -### Comment 2 by @dotChris90 (2018-11-08T10:19:18Z) - -@Oceania2018 just one little thing. Sorry I mention it. - -Shouldn't it be: - -var a = np.arange(9).Reshape(3,3)? - -So with capital R instead of small r? -The output of arange is a NDArray object. So we call its Reshape method. - -What we are doing is method chaining. So we do not use the np.reshape method (if exist didn't look ^^') but the NDArray Reshape method. - -### Comment 3 by @dotChris90 (2018-11-08T10:46:38Z) - -@Oceania2018 and question : shall we start doc with python sphinx? Or maybe take docfx? https://dotnet.github.io/docfx/ - -Just idk if sphinx can parse c# for api documentations by doc comments. - -### Comment 4 by @Oceania2018 (2018-11-08T11:34:21Z) - -We should use both of them, docfx is for generating md files, Sphinx is for organizing them, and make docs readable on readthedocs.io. - - -I prefer arange().reshape(), keep same as numpy as much as possible. - -### Comment 5 by @dotChris90 (2018-11-17T18:19:34Z) - -@Oceania2018 at the moment I experiment with docfx - it does not look as bad as i though. Especially the API documentation and the style looks promising. Moreover docfx is the one which is used from Microsoft I though. The hosting we could do on Github Pages. - -Just feel annoyed at sphinx python doc, that it highlight my C# code but it thinks it is python lol so the code looks not good. And was investigating for C# docs at moment. - -How you think of docfx? i tried at https://dotchris90.github.io/NumSharp/ I will not merge it to Scisharp/NumSharp - so dont worry but I will see how well this can look like. - -### Comment 6 by @Oceania2018 (2018-11-17T18:30:20Z) - -Does docfx generate markdown file? I think docfx is used to generate developer's API reference, because it is generated from souce code directly. Sphinx is often used to make tutorial document, like quick start. Sphinx support markdown file, it's easy to use. - -### Comment 7 by @dotChris90 (2018-11-17T18:58:24Z) - -Yes they are now able to do it. I was also surprised. Seems they developed quite well. - -You can write so called articles which is equivalent sphinx tutorials. Using markdown. Very easy seems. So tutorials and api and swagger rest api and more seems (ok rest API is not important for us....). - -I can maybe experiment with it and upload to my repo. If we think it looks good we can go with it. If not we take sphinx. - -### Comment 8 by @dotChris90 (2018-11-18T17:01:07Z) - -@Oceania2018 an example for our api -https://dotchris90.github.io/NumSharp/api/NumSharp.NDArray-1.html - -And example for article : -https://dotchris90.github.io/NumSharp/articles/NDArray.Creation.html - -@Oceania2018 if u not too angry with me. I would like to go with docfx. They plan to support multiple languages besides c# in future and using 100% md for articles. Plus the generated docs folder can be hosted 100% on github for free. - -The only thing that I am not satisfied is... The style. I look now for better template... - - - - -### Comment 9 by @Oceania2018 (2018-11-19T02:29:48Z) - -@dotChris90 Docfx looks awesome. keep going. - -### Comment 10 by @dotChris90 (2018-11-19T02:48:29Z) - -@Oceania2018 thanks. Before thinking about pull requests. Is NumSharps github page active? If not, could you activate it? Not sure if I can since u the founder / constructor of SciSharp organizations. :) - -### Comment 11 by @Oceania2018 (2018-11-19T03:22:12Z) - -@dotChris90 It's active. https://scisharp.github.io/NumSharp/ - -### Comment 12 by @dotChris90 (2018-11-19T03:29:29Z) - -@Oceania2018 thanks a lot. Then today maybe write some more user tutorials. ;) -And push. - -### Comment 13 by @Oceania2018 (2018-11-19T03:32:43Z) - -Sounds great. NumSharp got 80+ stars now. Seems like people really need it. - -### Comment 14 by @dotChris90 (2018-11-19T03:42:26Z) - -Totally. Before c# was not the language of numeric. Since this year Microsoft push this AI and ML topics so hard... But Microsoft didn't give us a numerical stack. - -But people deserve and need a numerical stack like NumSharp. :) - -### Comment 15 by @dotChris90 (2018-11-19T11:52:18Z) - -Ok it worked. Just merged the docs which I already made. Nothing new. But will write some tutorials for user and also a small Readme how to use docfx best. - -It's time we dotnet developers go deeper to science, machine learning and numerics. - -### Comment 16 by @fdncred (2018-11-19T13:54:26Z) - -docfx is looking good. - -### Comment 17 by @Nucs (2019-08-06T13:03:10Z) - -@henon @Oceania2018, Should we implement a documentation page like discussed here? -https://dotnet.github.io/docfx/ +# #70: Let more people know about NumSharp + +- **URL:** https://github.com/SciSharp/NumSharp/issues/70 +- **State:** OPEN +- **Author:** @Oceania2018 +- **Created:** 2018-11-08T03:07:08Z +- **Updated:** 2019-08-06T13:03:10Z +- **Labels:** help wanted + +## Description + +I've written an article [here](https://medium.com/@haiping008/numsharp-numerical-net-7c6ab6edfe27) which introduce NumSharp. + +@dotChris90 Can you start with the [docs](https://numsharp.readthedocs.io). + +## Comments + +### Comment 1 by @dotChris90 (2018-11-08T06:24:14Z) + +Would start maybe at weekends. Next 2 days have little bit more work to do. :) + +### Comment 2 by @dotChris90 (2018-11-08T10:19:18Z) + +@Oceania2018 just one little thing. Sorry I mention it. + +Shouldn't it be: + +var a = np.arange(9).Reshape(3,3)? + +So with capital R instead of small r? +The output of arange is a NDArray object. So we call its Reshape method. + +What we are doing is method chaining. So we do not use the np.reshape method (if exist didn't look ^^') but the NDArray Reshape method. + +### Comment 3 by @dotChris90 (2018-11-08T10:46:38Z) + +@Oceania2018 and question : shall we start doc with python sphinx? Or maybe take docfx? https://dotnet.github.io/docfx/ + +Just idk if sphinx can parse c# for api documentations by doc comments. + +### Comment 4 by @Oceania2018 (2018-11-08T11:34:21Z) + +We should use both of them, docfx is for generating md files, Sphinx is for organizing them, and make docs readable on readthedocs.io. + + +I prefer arange().reshape(), keep same as numpy as much as possible. + +### Comment 5 by @dotChris90 (2018-11-17T18:19:34Z) + +@Oceania2018 at the moment I experiment with docfx - it does not look as bad as i though. Especially the API documentation and the style looks promising. Moreover docfx is the one which is used from Microsoft I though. The hosting we could do on Github Pages. + +Just feel annoyed at sphinx python doc, that it highlight my C# code but it thinks it is python lol so the code looks not good. And was investigating for C# docs at moment. + +How you think of docfx? i tried at https://dotchris90.github.io/NumSharp/ I will not merge it to Scisharp/NumSharp - so dont worry but I will see how well this can look like. + +### Comment 6 by @Oceania2018 (2018-11-17T18:30:20Z) + +Does docfx generate markdown file? I think docfx is used to generate developer's API reference, because it is generated from souce code directly. Sphinx is often used to make tutorial document, like quick start. Sphinx support markdown file, it's easy to use. + +### Comment 7 by @dotChris90 (2018-11-17T18:58:24Z) + +Yes they are now able to do it. I was also surprised. Seems they developed quite well. + +You can write so called articles which is equivalent sphinx tutorials. Using markdown. Very easy seems. So tutorials and api and swagger rest api and more seems (ok rest API is not important for us....). + +I can maybe experiment with it and upload to my repo. If we think it looks good we can go with it. If not we take sphinx. + +### Comment 8 by @dotChris90 (2018-11-18T17:01:07Z) + +@Oceania2018 an example for our api +https://dotchris90.github.io/NumSharp/api/NumSharp.NDArray-1.html + +And example for article : +https://dotchris90.github.io/NumSharp/articles/NDArray.Creation.html + +@Oceania2018 if u not too angry with me. I would like to go with docfx. They plan to support multiple languages besides c# in future and using 100% md for articles. Plus the generated docs folder can be hosted 100% on github for free. + +The only thing that I am not satisfied is... The style. I look now for better template... + + + + +### Comment 9 by @Oceania2018 (2018-11-19T02:29:48Z) + +@dotChris90 Docfx looks awesome. keep going. + +### Comment 10 by @dotChris90 (2018-11-19T02:48:29Z) + +@Oceania2018 thanks. Before thinking about pull requests. Is NumSharps github page active? If not, could you activate it? Not sure if I can since u the founder / constructor of SciSharp organizations. :) + +### Comment 11 by @Oceania2018 (2018-11-19T03:22:12Z) + +@dotChris90 It's active. https://scisharp.github.io/NumSharp/ + +### Comment 12 by @dotChris90 (2018-11-19T03:29:29Z) + +@Oceania2018 thanks a lot. Then today maybe write some more user tutorials. ;) +And push. + +### Comment 13 by @Oceania2018 (2018-11-19T03:32:43Z) + +Sounds great. NumSharp got 80+ stars now. Seems like people really need it. + +### Comment 14 by @dotChris90 (2018-11-19T03:42:26Z) + +Totally. Before c# was not the language of numeric. Since this year Microsoft push this AI and ML topics so hard... But Microsoft didn't give us a numerical stack. + +But people deserve and need a numerical stack like NumSharp. :) + +### Comment 15 by @dotChris90 (2018-11-19T11:52:18Z) + +Ok it worked. Just merged the docs which I already made. Nothing new. But will write some tutorials for user and also a small Readme how to use docfx best. + +It's time we dotnet developers go deeper to science, machine learning and numerics. + +### Comment 16 by @fdncred (2018-11-19T13:54:26Z) + +docfx is looking good. + +### Comment 17 by @Nucs (2019-08-06T13:03:10Z) + +@henon @Oceania2018, Should we implement a documentation page like discussed here? +https://dotnet.github.io/docfx/ diff --git a/docs/issues/issue-0075-implement-numpy.asarray.md b/docs/issues/issue-0075-implement-numpy.asarray.md index 9e880acc..6297cceb 100644 --- a/docs/issues/issue-0075-implement-numpy.asarray.md +++ b/docs/issues/issue-0075-implement-numpy.asarray.md @@ -1,19 +1,19 @@ -# #75: Implement numpy.asarray - -- **URL:** https://github.com/SciSharp/NumSharp/issues/75 -- **State:** OPEN -- **Author:** @Oceania2018 -- **Created:** 2018-11-09T05:00:28Z -- **Updated:** 2018-11-14T22:04:06Z -- **Labels:** enhancement - -## Description - -Convert the input to an array. -https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.asarray.html - -## Comments - -### Comment 1 by @Obrain2016 (2018-11-14T22:04:06Z) - -adopt +# #75: Implement numpy.asarray + +- **URL:** https://github.com/SciSharp/NumSharp/issues/75 +- **State:** OPEN +- **Author:** @Oceania2018 +- **Created:** 2018-11-09T05:00:28Z +- **Updated:** 2018-11-14T22:04:06Z +- **Labels:** enhancement + +## Description + +Convert the input to an array. +https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.asarray.html + +## Comments + +### Comment 1 by @Obrain2016 (2018-11-14T22:04:06Z) + +adopt diff --git a/docs/issues/issue-0078-implement-numpy.where.md b/docs/issues/issue-0078-implement-numpy.where.md index 23c8e2a3..89f22400 100644 --- a/docs/issues/issue-0078-implement-numpy.where.md +++ b/docs/issues/issue-0078-implement-numpy.where.md @@ -1,19 +1,19 @@ -# #78: Implement numpy.where - -- **URL:** https://github.com/SciSharp/NumSharp/issues/78 -- **State:** OPEN -- **Author:** @Oceania2018 -- **Created:** 2018-11-09T05:07:46Z -- **Updated:** 2019-12-05T02:00:14Z -- **Labels:** enhancement - -## Description - -Return elements, either from x or y, depending on condition. -https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.where.html - -## Comments - -### Comment 1 by @rakshithm (2019-12-05T02:00:14Z) - -When can we expect this to be implemented? +# #78: Implement numpy.where + +- **URL:** https://github.com/SciSharp/NumSharp/issues/78 +- **State:** OPEN +- **Author:** @Oceania2018 +- **Created:** 2018-11-09T05:07:46Z +- **Updated:** 2019-12-05T02:00:14Z +- **Labels:** enhancement + +## Description + +Return elements, either from x or y, depending on condition. +https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.where.html + +## Comments + +### Comment 1 by @rakshithm (2019-12-05T02:00:14Z) + +When can we expect this to be implemented? diff --git a/docs/issues/issue-0095-extend-the-guidelines.md b/docs/issues/issue-0095-extend-the-guidelines.md index 3c348f14..1980af43 100644 --- a/docs/issues/issue-0095-extend-the-guidelines.md +++ b/docs/issues/issue-0095-extend-the-guidelines.md @@ -1,59 +1,59 @@ -# #95: Extend the guidelines - -- **URL:** https://github.com/SciSharp/NumSharp/issues/95 -- **State:** OPEN -- **Author:** @dotChris90 -- **Created:** 2018-11-10T18:36:50Z -- **Updated:** 2019-08-06T13:05:05Z -- **Assignees:** @Nucs - -## Description - -@Oceania2018 @fdncred I started our Wiki (was not a lot but at least some lines ....) - -On https://github.com/Oceania2018/NumSharp/wiki/Design-guidelines I started a page with guidelines. -Because I found our discussions and investigations last weeks very interesting and want to write them down. Especially casting, performance, arange instead of ARange, ... such things. - -If you do not like some parts, or want to add something, feel free to change. ;) - -## Comments - -### Comment 1 by @Oceania2018 (2018-11-12T23:03:19Z) - -Looks great. Good job! - -### Comment 2 by @Oceania2018 (2018-11-14T23:28:39Z) - -@dotChris90 @fdncred I've wrote an article [here](https://medium.com/@haiping008/numsharp-works-with-matplotlib-213f1753480). - -### Comment 3 by @fdncred (2018-11-15T00:17:59Z) - -Awesome! Good job. Maybe you should put your c# demo app in the repo as an example. - -### Comment 4 by @dotChris90 (2018-11-15T03:44:36Z) - -Amazing. I really was impressed when saw it. 🤩 - -### Comment 5 by @dotChris90 (2018-11-15T03:58:07Z) - -By the way. Technically background question. - -You used a matplotlib adapter and in background also using matplotlib. Amazing. - -I was wondering how much work it would be to make a own matplotlib but html based. - -In my mind hat sth like -- tiny web sever in background -- plotly.js as drawing lib -- chromely project for rendering - -### Comment 6 by @Oceania2018 (2018-11-15T04:00:32Z) - -Our hard work is worth it. NumSharp is providing enough methods to support high level library. -@dotChris90 I don't want to implement a ploting library for now. Let's focus on NumSharp and Pandas.NET. - -### Comment 7 by @dotChris90 (2018-11-15T04:08:50Z) - -Sure and agree. - -OH seems the f# guys already have sth like this with their xplot project so maybe even later no reason for us to implement +# #95: Extend the guidelines + +- **URL:** https://github.com/SciSharp/NumSharp/issues/95 +- **State:** OPEN +- **Author:** @dotChris90 +- **Created:** 2018-11-10T18:36:50Z +- **Updated:** 2019-08-06T13:05:05Z +- **Assignees:** @Nucs + +## Description + +@Oceania2018 @fdncred I started our Wiki (was not a lot but at least some lines ....) + +On https://github.com/Oceania2018/NumSharp/wiki/Design-guidelines I started a page with guidelines. +Because I found our discussions and investigations last weeks very interesting and want to write them down. Especially casting, performance, arange instead of ARange, ... such things. + +If you do not like some parts, or want to add something, feel free to change. ;) + +## Comments + +### Comment 1 by @Oceania2018 (2018-11-12T23:03:19Z) + +Looks great. Good job! + +### Comment 2 by @Oceania2018 (2018-11-14T23:28:39Z) + +@dotChris90 @fdncred I've wrote an article [here](https://medium.com/@haiping008/numsharp-works-with-matplotlib-213f1753480). + +### Comment 3 by @fdncred (2018-11-15T00:17:59Z) + +Awesome! Good job. Maybe you should put your c# demo app in the repo as an example. + +### Comment 4 by @dotChris90 (2018-11-15T03:44:36Z) + +Amazing. I really was impressed when saw it. 🤩 + +### Comment 5 by @dotChris90 (2018-11-15T03:58:07Z) + +By the way. Technically background question. + +You used a matplotlib adapter and in background also using matplotlib. Amazing. + +I was wondering how much work it would be to make a own matplotlib but html based. + +In my mind hat sth like +- tiny web sever in background +- plotly.js as drawing lib +- chromely project for rendering + +### Comment 6 by @Oceania2018 (2018-11-15T04:00:32Z) + +Our hard work is worth it. NumSharp is providing enough methods to support high level library. +@dotChris90 I don't want to implement a ploting library for now. Let's focus on NumSharp and Pandas.NET. + +### Comment 7 by @dotChris90 (2018-11-15T04:08:50Z) + +Sure and agree. + +OH seems the f# guys already have sth like this with their xplot project so maybe even later no reason for us to implement diff --git a/docs/issues/issue-0105-implement-numpy.vdot.md b/docs/issues/issue-0105-implement-numpy.vdot.md index 9737253e..7f75bb6d 100644 --- a/docs/issues/issue-0105-implement-numpy.vdot.md +++ b/docs/issues/issue-0105-implement-numpy.vdot.md @@ -1,22 +1,22 @@ -# #105: Implement numpy.vdot +# #105: Implement numpy.vdot + +- **URL:** https://github.com/SciSharp/NumSharp/issues/105 +- **State:** OPEN +- **Author:** @Oceania2018 +- **Created:** 2018-11-15T03:48:18Z +- **Updated:** 2018-11-15T16:48:44Z +- **Labels:** enhancement +- **Assignees:** @tatadyj + +## Description + +Return the dot product of two vectors. +https://docs.scipy.org/doc/numpy-1.15.1/reference/generated/numpy.vdot.html#numpy.vdot -- **URL:** https://github.com/SciSharp/NumSharp/issues/105 -- **State:** OPEN -- **Author:** @Oceania2018 -- **Created:** 2018-11-15T03:48:18Z -- **Updated:** 2018-11-15T16:48:44Z -- **Labels:** enhancement -- **Assignees:** @tatadyj - -## Description - -Return the dot product of two vectors. -https://docs.scipy.org/doc/numpy-1.15.1/reference/generated/numpy.vdot.html#numpy.vdot - -`ndarray.vdot` should be put in `LinearAlgebra` folder. - -## Comments - -### Comment 1 by @tatadyj (2018-11-15T16:45:36Z) - -give a try vdot +`ndarray.vdot` should be put in `LinearAlgebra` folder. + +## Comments + +### Comment 1 by @tatadyj (2018-11-15T16:45:36Z) + +give a try vdot diff --git a/docs/issues/issue-0106-implement-numpy.inner.md b/docs/issues/issue-0106-implement-numpy.inner.md index c33e59e0..cfd64910 100644 --- a/docs/issues/issue-0106-implement-numpy.inner.md +++ b/docs/issues/issue-0106-implement-numpy.inner.md @@ -1,16 +1,16 @@ -# #106: Implement numpy.inner +# #106: Implement numpy.inner + +- **URL:** https://github.com/SciSharp/NumSharp/issues/106 +- **State:** OPEN +- **Author:** @Oceania2018 +- **Created:** 2018-11-15T03:49:36Z +- **Updated:** 2018-12-28T07:03:26Z +- **Labels:** help wanted +- **Milestone:** v0.7 + +## Description + +Inner product of two arrays. +https://docs.scipy.org/doc/numpy-1.15.1/reference/generated/numpy.inner.html#numpy.inner -- **URL:** https://github.com/SciSharp/NumSharp/issues/106 -- **State:** OPEN -- **Author:** @Oceania2018 -- **Created:** 2018-11-15T03:49:36Z -- **Updated:** 2018-12-28T07:03:26Z -- **Labels:** help wanted -- **Milestone:** v0.7 - -## Description - -Inner product of two arrays. -https://docs.scipy.org/doc/numpy-1.15.1/reference/generated/numpy.inner.html#numpy.inner - -`ndarray.inner` should be put in `LinearAlgebra` folder. +`ndarray.inner` should be put in `LinearAlgebra` folder. diff --git a/docs/issues/issue-0108-implement-numpy.tensordot.md b/docs/issues/issue-0108-implement-numpy.tensordot.md index fedf7282..6bca841e 100644 --- a/docs/issues/issue-0108-implement-numpy.tensordot.md +++ b/docs/issues/issue-0108-implement-numpy.tensordot.md @@ -1,16 +1,16 @@ -# #108: Implement numpy.tensordot +# #108: Implement numpy.tensordot + +- **URL:** https://github.com/SciSharp/NumSharp/issues/108 +- **State:** OPEN +- **Author:** @Oceania2018 +- **Created:** 2018-11-15T03:51:17Z +- **Updated:** 2018-12-28T07:03:44Z +- **Labels:** help wanted +- **Milestone:** v0.7 + +## Description + +Compute tensor dot product along specified axes for arrays >= 1-D. +https://docs.scipy.org/doc/numpy-1.15.1/reference/generated/numpy.tensordot.html#numpy.tensordot -- **URL:** https://github.com/SciSharp/NumSharp/issues/108 -- **State:** OPEN -- **Author:** @Oceania2018 -- **Created:** 2018-11-15T03:51:17Z -- **Updated:** 2018-12-28T07:03:44Z -- **Labels:** help wanted -- **Milestone:** v0.7 - -## Description - -Compute tensor dot product along specified axes for arrays >= 1-D. -https://docs.scipy.org/doc/numpy-1.15.1/reference/generated/numpy.tensordot.html#numpy.tensordot - -`ndarray.tensordot` should be put in `LinearAlgebra` folder. +`ndarray.tensordot` should be put in `LinearAlgebra` folder. diff --git a/docs/issues/issue-0114-implement-numpy.fft.fft.md b/docs/issues/issue-0114-implement-numpy.fft.fft.md index ccd05fde..0e8ece26 100644 --- a/docs/issues/issue-0114-implement-numpy.fft.fft.md +++ b/docs/issues/issue-0114-implement-numpy.fft.fft.md @@ -1,13 +1,13 @@ -# #114: Implement numpy.fft.fft - -- **URL:** https://github.com/SciSharp/NumSharp/issues/114 -- **State:** OPEN -- **Author:** @Oceania2018 -- **Created:** 2018-11-17T04:35:25Z -- **Updated:** 2018-11-17T04:35:47Z -- **Labels:** enhancement - -## Description - -Compute the one-dimensional discrete Fourier Transform. -https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.fft.fft.html#numpy.fft.fft +# #114: Implement numpy.fft.fft + +- **URL:** https://github.com/SciSharp/NumSharp/issues/114 +- **State:** OPEN +- **Author:** @Oceania2018 +- **Created:** 2018-11-17T04:35:25Z +- **Updated:** 2018-11-17T04:35:47Z +- **Labels:** enhancement + +## Description + +Compute the one-dimensional discrete Fourier Transform. +https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.fft.fft.html#numpy.fft.fft diff --git a/docs/issues/issue-0116-intel-math-kernel-library-mkl.md b/docs/issues/issue-0116-intel-math-kernel-library-mkl.md index cd84ae8d..2ca50fae 100644 --- a/docs/issues/issue-0116-intel-math-kernel-library-mkl.md +++ b/docs/issues/issue-0116-intel-math-kernel-library-mkl.md @@ -1,321 +1,321 @@ -# #116: Intel Math Kernel Library (MKL) - -- **URL:** https://github.com/SciSharp/NumSharp/issues/116 -- **State:** OPEN -- **Author:** @Oceania2018 -- **Created:** 2018-11-17T15:12:25Z -- **Updated:** 2019-05-02T16:53:31Z -- **Labels:** enhancement, help wanted -- **Assignees:** @dotChris90 -- **Milestone:** v0.7 - -## Description - -Performance-sensitive algorithms can be swapped with alternative implementations by the concept of providers like Intel MKL. -https://software.intel.com/en-us/performance-libraries - -## Comments - -### Comment 1 by @dotChris90 (2018-12-12T20:01:13Z) - -Intels MKL library implement the LAPACK interfaces - so it would be logical to think about a layer with different LAPACK providers - in other words - a strategy pattern. Let users decide which LAPACK provider they want to use. - -It will be not much work since LAPACK usual means --> all interfaces are the same. So the PInvoke class would be the same - just the native lib is different. - -As fdncred already said. :) - -### Comment 2 by @Oceania2018 (2018-12-12T20:01:52Z) - -Sounds great. - -### Comment 3 by @fdncred (2018-12-12T20:05:26Z) - -This is exactly what I was saying in #145 when I mentioned and linked to Armadillo. - -### Comment 4 by @dotChris90 (2018-12-13T07:27:39Z) - -@fdncred sorry yes i know but I want to mention it here at this place ;) - -### Comment 5 by @Oceania2018 (2018-12-13T18:04:00Z) - -@dotChris90 Please add MKL as a new provider when you have a chance. - -### Comment 6 by @dotChris90 (2018-12-13T18:29:30Z) - -yes. but after seeing Intel website I think we go strategy that mkl provider expects the lib installed. on their site they said u have to registry etc..... So.... I don't wanna quarrel with them. in case we simple copy their DLLs and publish them with NumSharp.... think Intel will be not happy. - -so installation must be done manually by user. - -At moment not sure what is most comfortable way to change providers. - -My suggestion is that static numpy class has a static property lapack provider which is an enum. - -The static lapack class will check this enum and will call the specific static lapack provider classes. - -The user can change provider global. I think most comfortable. - -### Comment 7 by @fdncred (2018-12-13T19:04:47Z) - -@dotChris90, I'll research this a bit because other people, namely microsoft, point to dlls such as this https://docs.microsoft.com/en-us/cognitive-toolkit/setup-mkl-on-windows. - -Now that I look closer, this one ls mklml and is opensource by intel. Perhaps that is different. - -### Comment 8 by @fdncred (2018-12-13T19:12:12Z) - -Check this out. Intel allows one to redistribute MKL. It's in the license. -https://software.intel.com/en-us/mkl/license-faq - -And here is the full license. -https://software.intel.com/en-us/license/intel-simplified-software-license - - -### Comment 9 by @fdncred (2018-12-13T19:20:21Z) - -Here's a few Github projects that wrap MKL in C#. May be easier just to use something that already exists. -https://github.com/DNRY/CSIntelPerfLibs -https://github.com/Rafka86/SharpMKL -https://github.com/Proxem/BlasNet - - -### Comment 10 by @dotChris90 (2018-12-13T19:40:01Z) - -@fdncred much thanks for investigation. This makes the situation much better. 👍 - -### Comment 11 by @dotChris90 (2018-12-14T07:26:10Z) - -Hm - ok it will not be so easy as I though. - -The problem is that MKL implement just a subset of LAPACK and it implement LAPACKE - not LAPACK. They are little bit different from interfaces. - -The LAPACK we have at moment (Standard) has about 1500 Functions - MKL has 450. But is much bigger .... NetLib is about 8MB and their MKL 150MB -.- - -Sorry I say - this issue will be open little bit longer because Intel just implement what they want .... - -### Comment 12 by @dotChris90 (2018-12-14T07:36:25Z) - -But do not worry - the Provider strategy I still want to follow. ;) - -### Comment 13 by @dotChris90 (2019-01-05T08:36:59Z) - -ok some news from my side. - -MKL is installable on Linux via https://gist.github.com/pachamaltese/afc4faef2f191b533556f261a46b3aa8 -and on Windows via PIP with command"pip install mkl". - -With this Libs can check what functions **are really exported**. - -@Oceania2018 @fdncred just one question to you 2. What you think about "put providers in separate packages?" Like "NumSharp.MKLProvider" and so on. The benefit would be --> do unit Tests and maybe automatic benchmark Tests just when the provider project made some changes and not NumSharp. -Appveyor would be capable of this. - -@Oceania2018 this would be maybe also a solution for Tensorflow.NET --> package the Libs as Provider in new Nuget Package. - -### Comment 14 by @Oceania2018 (2019-01-05T11:21:41Z) - -Seems like if we separate NumSharp.MKLProvider, we need to separate an Interface project too, then we will have 3 separate NuGet packages, right? - -### Comment 15 by @fdncred (2019-01-05T13:36:58Z) - -I like the idea of separate packages because it gives users a choice. - -### Comment 16 by @dotChris90 (2019-01-05T14:40:46Z) - -@Oceania2018 I think so. at least easiest solution. also agree with @fdncred. people can free choose. maybe we even can pack mkl in nuget package like python do. since pip offers nuget also could do. and we could offer nuget package with tensorflow C Api. - - I think it could be best solution because people can use mkl if they like or not. or take standard lapack. - -by the way on Friday I checked the CI of the standard open source lapack. with appveyor was able to build the DLLs and shared objects myself. - -If appveyor offers mac OS images we also could support Mac OS. - - -### Comment 17 by @Oceania2018 (2019-01-05T14:53:49Z) - -@dotChris90 you can try to add a new project. - -### Comment 18 by @dotChris90 (2019-01-05T20:34:53Z) - -Ok before do the stuff just want to clear with you 2 (@Oceania2018 @fdncred ) the plan. - -Our NumSharp repo would consist of - -- NumSharp.Core => our main project with no provider just abstraction (like an interface ILAPACKProvider) -- NumSharp.NetLibLAPACK => it provides the default LAPACK implementation from https://github.com/Reference-LAPACK/lapack (we could fork it and build C# wrapper classes - already was able to set it up on appveyor and generate some *.dlls -- NumSharp.IntelMKL => it provides the MKL from Intel with LAPACK (just can deliver the binaries - no source code) -- Ironpython and Powershell projects but they are not relevant for our providers - -Beside This I suggest one more thing -- folder "NumSharp.Meta" with a nuget spec file -- the NumSharp.Meta folder with its nuget spec file shall be used to generate an metapackage called simple "NumSharp" (this NumSharp package should add multiple references to users project like NumSharp.Core + NumSharp.NetLibLAPACK - in future we can add more but for now this 2 references are enough) -- why we should do it? --> users just need to do "dotnet add package NumSharp" (so 1 instead of 2 add package commands) and can start! but! important! they can remove the reference to NetLibLAPACK by themselves and add the IntelMKL - and everybody is happy. ;) - -@Oceania2018 for Tensorflow.NET I also suggest this solution with meta-package - so we deliver Tensorflow C API as package for users. - -### Comment 19 by @dotChris90 (2019-01-05T20:45:28Z) - -But also the annoying news .... Since we take a provider strategy we must take an OOP strategy pattern and ... they do not work with static methods. This just means our providers must be implemented as non-static classes with constructor - or other said - they must implement an interface. - -This is no bad thing just brings more code. we need our static methods to adapt the native libraries and we need the non static methods to implement interface. - -### Comment 20 by @Oceania2018 (2019-01-05T22:08:17Z) - -@dotChris90 Where is the interface project? We should have another Interface project dll. - -### Comment 21 by @dotChris90 (2019-01-07T19:46:35Z) - -hm I am not sure at moment. - -We could make a separate project and package or keep it in NumSharp.Core. -At moment think about pros and cons. - -### Comment 22 by @Oceania2018 (2019-01-07T19:52:20Z) - -OK, do more research. - -### Comment 23 by @buybackoff (2019-01-07T19:59:49Z) - -Have you looked at Math.Net MKL provider? Or at Math.Net integration at all? As far as I remember Math.Net has its own native wrapper over which they interop, but it should be trivial to amend if all parties agree. I'm following this project/stack for a while and happy if Python stack is repeated 1-to-1 in .NET, but having several options that basically do the same stuff seems sad. Especially given the size of MKL dependency. - -Cc @cdrnet - -### Comment 24 by @Oceania2018 (2019-01-07T20:57:15Z) - -@dotChris90 Do you know how much size of the MKL dll? As my experience of TensorFlow.NET, tensorflow.dll is about 65M, luckly the NuGet compress it to about 16M. So I pack the dll directly into NuGet, It's acceptable. - -### Comment 25 by @pkingwsd (2019-01-08T02:46:16Z) - -as below from MathNet - - -Licensing Restrictions -Be aware that unlike the core of Math.NET Numerics including the native wrapper, which are both open source under the terms of the MIT/X11 license, the Intel MKL binaries themselves are closed source and non-free. - -The Math.NET Numerics project does own an Intel MKL license (for Windows, no longer for Linux) and thus does have the right to distribute it along Math.NET Numerics. You can therefore use the Math.NET Numerics MKL native provider for free for your own use. However, it does not give you any right to redistribute it again yourself to customers of your own product. If you need to redistribute, buy a license from Intel. If unsure, contact the Intel sales team to clarify. - -@Oceania2018 -MathNet.Numerics.MKL.Win-x64 nuget package, the size about 136 MB, mathnet.numerics.mkl.linux-x64 about 134m - - -### Comment 26 by @Oceania2018 (2019-01-08T02:50:27Z) - -@pkingwsd It means we can't pack MKL into NumSharp's package? @dotChris90 so we just have to place the download link for user? - -### Comment 27 by @pkingwsd (2019-01-08T02:57:28Z) - -@Oceania2018 i thank so that ,just make NumSharp's MKL for windows package. - -### Comment 28 by @dotChris90 (2019-01-08T07:00:00Z) - -@buybackoff thanks for mention it. Actually I was thinking about this **BUT** (there is always a but ... ) I am really unsure about Intel Licensing etc. Not sure if we can use their Math.NET Libs .... thats the only reason. -To be honest - we plan that at the end is just one meta-data package called **NumSharp** and this contains references to **NumSharp.Core** and **NetLibLAPACK** package. - -For NetLibLAPACK Standard - I already tried out their build system with my personal account https://github.com/dotChris90/lapack. I am sure if we mention them in our Readme its ok for them. - -MKL is tricky. For standard user who just want to learn and get things done I prefer the NetLibLAPACK Lib. which will be reference when using "dotnet add package NumSharp" in future. But .... when we cleared this discussion about MKL .... we want to give user the chance to remove this NetLibLAPACK reference from their project and use MKL intel. This will reduce the space in memory and hard disk space. - -### Comment 29 by @dotChris90 (2019-01-08T07:04:37Z) - -@Oceania2018 @pkingwsd damn ... this license stuff get more complex .... but yes he is right. **If you do not mind - I will write an email to intel sales team to clear things.** - -I am little confused at moment since the Linux MKL is a simple debian based package and can be downloaded any time. So I though there is no restriction for windows also. But I am not sure so far. Because I can not find official windows repo for MKL ..... - -### Comment 30 by @dotChris90 (2019-01-08T15:00:49Z) - -@Oceania2018 @pkingwsd what about this section https://software.intel.com/en-us/mkl/license-faq ? -In the FAQ stand Yes, redistribution is allowed per the terms of the ISSL. and also no payment etc. - -### Comment 31 by @Oceania2018 (2019-01-08T15:18:30Z) - -Great, so we don't need to worry about the license problem per the official statement. - -### Comment 32 by @dotChris90 (2019-01-08T15:41:53Z) - -still wrote to them. I want a statement of them.... BTW fdncred also mentioned it before lol the faq but as I said I wait for their response. - -### Comment 33 by @fdncred (2019-01-08T16:04:00Z) - -yeah! someone reads my comments. LOL! ;) - -### Comment 34 by @dotChris90 (2019-01-08T16:09:44Z) - -@fdncred definitely. I am just highly confused about the mkl libraries out there. - -is anaconda mkl the same like normal mkl and why there is no package for windows... the apt get installer also just download the file and put at specific locations... - -drives me crazy.... - -### Comment 35 by @fdncred (2019-01-08T16:47:58Z) - -@dotChris90 it appears to me that anaconda's MKL is just the regular MKL. It also looks to me like there is a windows package. See the links below. -https://anaconda.org/anaconda/mkl -https://docs.anaconda.com/accelerate/mkl-overview/ -https://repo.anaconda.com/pkgs/main/win-64/ -For my two cents, I think Proxem's BlasNet is the best wrapper for MKL. It looks pretty mature. +# #116: Intel Math Kernel Library (MKL) + +- **URL:** https://github.com/SciSharp/NumSharp/issues/116 +- **State:** OPEN +- **Author:** @Oceania2018 +- **Created:** 2018-11-17T15:12:25Z +- **Updated:** 2019-05-02T16:53:31Z +- **Labels:** enhancement, help wanted +- **Assignees:** @dotChris90 +- **Milestone:** v0.7 + +## Description + +Performance-sensitive algorithms can be swapped with alternative implementations by the concept of providers like Intel MKL. +https://software.intel.com/en-us/performance-libraries + +## Comments + +### Comment 1 by @dotChris90 (2018-12-12T20:01:13Z) + +Intels MKL library implement the LAPACK interfaces - so it would be logical to think about a layer with different LAPACK providers - in other words - a strategy pattern. Let users decide which LAPACK provider they want to use. + +It will be not much work since LAPACK usual means --> all interfaces are the same. So the PInvoke class would be the same - just the native lib is different. + +As fdncred already said. :) + +### Comment 2 by @Oceania2018 (2018-12-12T20:01:52Z) + +Sounds great. + +### Comment 3 by @fdncred (2018-12-12T20:05:26Z) + +This is exactly what I was saying in #145 when I mentioned and linked to Armadillo. + +### Comment 4 by @dotChris90 (2018-12-13T07:27:39Z) + +@fdncred sorry yes i know but I want to mention it here at this place ;) + +### Comment 5 by @Oceania2018 (2018-12-13T18:04:00Z) + +@dotChris90 Please add MKL as a new provider when you have a chance. + +### Comment 6 by @dotChris90 (2018-12-13T18:29:30Z) + +yes. but after seeing Intel website I think we go strategy that mkl provider expects the lib installed. on their site they said u have to registry etc..... So.... I don't wanna quarrel with them. in case we simple copy their DLLs and publish them with NumSharp.... think Intel will be not happy. + +so installation must be done manually by user. + +At moment not sure what is most comfortable way to change providers. + +My suggestion is that static numpy class has a static property lapack provider which is an enum. + +The static lapack class will check this enum and will call the specific static lapack provider classes. + +The user can change provider global. I think most comfortable. + +### Comment 7 by @fdncred (2018-12-13T19:04:47Z) + +@dotChris90, I'll research this a bit because other people, namely microsoft, point to dlls such as this https://docs.microsoft.com/en-us/cognitive-toolkit/setup-mkl-on-windows. + +Now that I look closer, this one ls mklml and is opensource by intel. Perhaps that is different. + +### Comment 8 by @fdncred (2018-12-13T19:12:12Z) + +Check this out. Intel allows one to redistribute MKL. It's in the license. +https://software.intel.com/en-us/mkl/license-faq + +And here is the full license. +https://software.intel.com/en-us/license/intel-simplified-software-license + + +### Comment 9 by @fdncred (2018-12-13T19:20:21Z) + +Here's a few Github projects that wrap MKL in C#. May be easier just to use something that already exists. +https://github.com/DNRY/CSIntelPerfLibs +https://github.com/Rafka86/SharpMKL https://github.com/Proxem/BlasNet - -### Comment 36 by @dotChris90 (2019-01-08T21:13:48Z) - -@fdncred Thanks for the update. ;) - -From the URL I agree with you. 👍 -I already downloaded the package via pip and checked it but the package brings multiple MKL dlls. In anaconda location you will find binaries with mkl_corem mkl_xyz, …. about 6 or 7 files. But I though the mkl thing is one single DLL …. but anaconda shows multiple .... this is extrem strange behaviour... - -I agree Proxems BlasNet looks fine but it does not solve our main problem. Proxem just brings Wrapper code in C# - please do not misunderstand me but I am not very impressed by this …. because there are a lot of C# Code-Generators who do the same job - e.g. ClangSharp, T4, SWIG and if I check the Mono team I am 100% sure I can find more generators. xD Such automatic wrapper always simple take a C header file and generate Code …. I really do not see any benefit to use it BlasNet. I saw the Code and as far as I can see the main methods we can use could be also generated automaticly by ClangSharp (or T4) so not sure why add package for something we can auto generate xD. - -Our (at least what makes me feel uncomfortable) problem is : Proxem does not bring a native MKL Lib package. I have to install it manually. In Linux its easy - "sudo apt-get install" but on windows it is impossible to do this. This makes CI Testing impossible. How do we want to do unit testing or automatic benchmark testing on Appveyor? Unfortunately -.- we can not do this - except we package this MKL DLL into a nuget package. damn windows has no apt get.... - - -### Comment 37 by @fdncred (2019-01-08T22:08:23Z) - -Probably not impossible for CI. Have you looked at using chocolatey to install MKL? It looks like one of microsoft's packages includes it https://chocolatey.org/packages/microsoft-r-open. It may not be perfect but it may work. - -I've had a lot of experience with ClangSharp and NClang as well as other generators to take a C/C++ library to C# and I'm quite sure that they are not easy. I've found with one for months trying to get the library ported and it's very time consuming. You can get close pretty easily but you can't get complete easily. It'll take work for sure. - -### Comment 38 by @dotChris90 (2019-01-09T05:16:00Z) - -damn choco package management didn't think on it yes. can try. thanks. - -If u say it is hard maybe I was too easy thinking. the only complex thing we could have with code generation is.... lapack 100 % uses pointer. so generator can not know what's array and what pass by reference. - -hm...yes could be trickier. but as long as we just using some few functions from lapack.... writing own is easier. but yes maybe later need some more professional things. - -### Comment 39 by @fdncred (2019-01-09T13:56:05Z) - -Yes, IntPtr from C/C++ can be tricky and requires hand massaging for every call, from my experience. Marshalling arrays isn't too complex if you know the count of the array and the size of the array. Ref, In, Out params can be tricky, especially if you have an [In, Out] parameter in C/C++, where you pass in out value in a parameter and you return a different value out of the same parameter. If you get stuck on something reach out to me and I may be able to help. - -### Comment 40 by @Oceania2018 (2019-01-09T14:11:46Z) - -@fdncred can you help with -https://github.com/SciSharp/TensorFlow.NET/issues/86? - -### Comment 41 by @fdncred (2019-01-09T14:17:14Z) - -@Oceania2018, yes, i'll look at it. I'm not promising i can fix it but I'll try. ;) - -### Comment 42 by @Oceania2018 (2019-01-09T14:22:30Z) - -Anyway I’d appreciate. Try to make it work. Enjoy tensorflow.net. - -### Comment 43 by @dotChris90 (2019-01-10T06:06:45Z) - -for traceability. Intel just offer you help if u have customer service.. yeah every company need money I know.... - -But post in forum and got answer direct from Intel. - -https://software.intel.com/en-us/comment/1932183#comment-1932183 - -as we can read there. don't worry take the mkl lib. - -answers was (2019 Jan 10th, 7:09 Berlin time) - -please refer here : license FAQ - -you won't have a problem redistributing it. - -### Comment 44 by @mzhukova (2019-05-02T16:53:31Z) - -Hi folks, -I saw on the Intel forum that you were asking about distributing MKL via nuget. -It is available now in nuget channel as well. I was just wondering, if this may be useful to you: https://www.nuget.org/packages?q=intelmkl - -Best regards, -Maria + + +### Comment 10 by @dotChris90 (2018-12-13T19:40:01Z) + +@fdncred much thanks for investigation. This makes the situation much better. 👍 + +### Comment 11 by @dotChris90 (2018-12-14T07:26:10Z) + +Hm - ok it will not be so easy as I though. + +The problem is that MKL implement just a subset of LAPACK and it implement LAPACKE - not LAPACK. They are little bit different from interfaces. + +The LAPACK we have at moment (Standard) has about 1500 Functions - MKL has 450. But is much bigger .... NetLib is about 8MB and their MKL 150MB -.- + +Sorry I say - this issue will be open little bit longer because Intel just implement what they want .... + +### Comment 12 by @dotChris90 (2018-12-14T07:36:25Z) + +But do not worry - the Provider strategy I still want to follow. ;) + +### Comment 13 by @dotChris90 (2019-01-05T08:36:59Z) + +ok some news from my side. + +MKL is installable on Linux via https://gist.github.com/pachamaltese/afc4faef2f191b533556f261a46b3aa8 +and on Windows via PIP with command"pip install mkl". + +With this Libs can check what functions **are really exported**. + +@Oceania2018 @fdncred just one question to you 2. What you think about "put providers in separate packages?" Like "NumSharp.MKLProvider" and so on. The benefit would be --> do unit Tests and maybe automatic benchmark Tests just when the provider project made some changes and not NumSharp. +Appveyor would be capable of this. + +@Oceania2018 this would be maybe also a solution for Tensorflow.NET --> package the Libs as Provider in new Nuget Package. + +### Comment 14 by @Oceania2018 (2019-01-05T11:21:41Z) + +Seems like if we separate NumSharp.MKLProvider, we need to separate an Interface project too, then we will have 3 separate NuGet packages, right? + +### Comment 15 by @fdncred (2019-01-05T13:36:58Z) + +I like the idea of separate packages because it gives users a choice. + +### Comment 16 by @dotChris90 (2019-01-05T14:40:46Z) + +@Oceania2018 I think so. at least easiest solution. also agree with @fdncred. people can free choose. maybe we even can pack mkl in nuget package like python do. since pip offers nuget also could do. and we could offer nuget package with tensorflow C Api. + + I think it could be best solution because people can use mkl if they like or not. or take standard lapack. + +by the way on Friday I checked the CI of the standard open source lapack. with appveyor was able to build the DLLs and shared objects myself. + +If appveyor offers mac OS images we also could support Mac OS. + + +### Comment 17 by @Oceania2018 (2019-01-05T14:53:49Z) + +@dotChris90 you can try to add a new project. + +### Comment 18 by @dotChris90 (2019-01-05T20:34:53Z) + +Ok before do the stuff just want to clear with you 2 (@Oceania2018 @fdncred ) the plan. + +Our NumSharp repo would consist of + +- NumSharp.Core => our main project with no provider just abstraction (like an interface ILAPACKProvider) +- NumSharp.NetLibLAPACK => it provides the default LAPACK implementation from https://github.com/Reference-LAPACK/lapack (we could fork it and build C# wrapper classes - already was able to set it up on appveyor and generate some *.dlls +- NumSharp.IntelMKL => it provides the MKL from Intel with LAPACK (just can deliver the binaries - no source code) +- Ironpython and Powershell projects but they are not relevant for our providers + +Beside This I suggest one more thing +- folder "NumSharp.Meta" with a nuget spec file +- the NumSharp.Meta folder with its nuget spec file shall be used to generate an metapackage called simple "NumSharp" (this NumSharp package should add multiple references to users project like NumSharp.Core + NumSharp.NetLibLAPACK - in future we can add more but for now this 2 references are enough) +- why we should do it? --> users just need to do "dotnet add package NumSharp" (so 1 instead of 2 add package commands) and can start! but! important! they can remove the reference to NetLibLAPACK by themselves and add the IntelMKL - and everybody is happy. ;) + +@Oceania2018 for Tensorflow.NET I also suggest this solution with meta-package - so we deliver Tensorflow C API as package for users. + +### Comment 19 by @dotChris90 (2019-01-05T20:45:28Z) + +But also the annoying news .... Since we take a provider strategy we must take an OOP strategy pattern and ... they do not work with static methods. This just means our providers must be implemented as non-static classes with constructor - or other said - they must implement an interface. + +This is no bad thing just brings more code. we need our static methods to adapt the native libraries and we need the non static methods to implement interface. + +### Comment 20 by @Oceania2018 (2019-01-05T22:08:17Z) + +@dotChris90 Where is the interface project? We should have another Interface project dll. + +### Comment 21 by @dotChris90 (2019-01-07T19:46:35Z) + +hm I am not sure at moment. + +We could make a separate project and package or keep it in NumSharp.Core. +At moment think about pros and cons. + +### Comment 22 by @Oceania2018 (2019-01-07T19:52:20Z) + +OK, do more research. + +### Comment 23 by @buybackoff (2019-01-07T19:59:49Z) + +Have you looked at Math.Net MKL provider? Or at Math.Net integration at all? As far as I remember Math.Net has its own native wrapper over which they interop, but it should be trivial to amend if all parties agree. I'm following this project/stack for a while and happy if Python stack is repeated 1-to-1 in .NET, but having several options that basically do the same stuff seems sad. Especially given the size of MKL dependency. + +Cc @cdrnet + +### Comment 24 by @Oceania2018 (2019-01-07T20:57:15Z) + +@dotChris90 Do you know how much size of the MKL dll? As my experience of TensorFlow.NET, tensorflow.dll is about 65M, luckly the NuGet compress it to about 16M. So I pack the dll directly into NuGet, It's acceptable. + +### Comment 25 by @pkingwsd (2019-01-08T02:46:16Z) + +as below from MathNet + + +Licensing Restrictions +Be aware that unlike the core of Math.NET Numerics including the native wrapper, which are both open source under the terms of the MIT/X11 license, the Intel MKL binaries themselves are closed source and non-free. + +The Math.NET Numerics project does own an Intel MKL license (for Windows, no longer for Linux) and thus does have the right to distribute it along Math.NET Numerics. You can therefore use the Math.NET Numerics MKL native provider for free for your own use. However, it does not give you any right to redistribute it again yourself to customers of your own product. If you need to redistribute, buy a license from Intel. If unsure, contact the Intel sales team to clarify. + +@Oceania2018 +MathNet.Numerics.MKL.Win-x64 nuget package, the size about 136 MB, mathnet.numerics.mkl.linux-x64 about 134m + + +### Comment 26 by @Oceania2018 (2019-01-08T02:50:27Z) + +@pkingwsd It means we can't pack MKL into NumSharp's package? @dotChris90 so we just have to place the download link for user? + +### Comment 27 by @pkingwsd (2019-01-08T02:57:28Z) + +@Oceania2018 i thank so that ,just make NumSharp's MKL for windows package. + +### Comment 28 by @dotChris90 (2019-01-08T07:00:00Z) + +@buybackoff thanks for mention it. Actually I was thinking about this **BUT** (there is always a but ... ) I am really unsure about Intel Licensing etc. Not sure if we can use their Math.NET Libs .... thats the only reason. +To be honest - we plan that at the end is just one meta-data package called **NumSharp** and this contains references to **NumSharp.Core** and **NetLibLAPACK** package. + +For NetLibLAPACK Standard - I already tried out their build system with my personal account https://github.com/dotChris90/lapack. I am sure if we mention them in our Readme its ok for them. + +MKL is tricky. For standard user who just want to learn and get things done I prefer the NetLibLAPACK Lib. which will be reference when using "dotnet add package NumSharp" in future. But .... when we cleared this discussion about MKL .... we want to give user the chance to remove this NetLibLAPACK reference from their project and use MKL intel. This will reduce the space in memory and hard disk space. + +### Comment 29 by @dotChris90 (2019-01-08T07:04:37Z) + +@Oceania2018 @pkingwsd damn ... this license stuff get more complex .... but yes he is right. **If you do not mind - I will write an email to intel sales team to clear things.** + +I am little confused at moment since the Linux MKL is a simple debian based package and can be downloaded any time. So I though there is no restriction for windows also. But I am not sure so far. Because I can not find official windows repo for MKL ..... + +### Comment 30 by @dotChris90 (2019-01-08T15:00:49Z) + +@Oceania2018 @pkingwsd what about this section https://software.intel.com/en-us/mkl/license-faq ? +In the FAQ stand Yes, redistribution is allowed per the terms of the ISSL. and also no payment etc. + +### Comment 31 by @Oceania2018 (2019-01-08T15:18:30Z) + +Great, so we don't need to worry about the license problem per the official statement. + +### Comment 32 by @dotChris90 (2019-01-08T15:41:53Z) + +still wrote to them. I want a statement of them.... BTW fdncred also mentioned it before lol the faq but as I said I wait for their response. + +### Comment 33 by @fdncred (2019-01-08T16:04:00Z) + +yeah! someone reads my comments. LOL! ;) + +### Comment 34 by @dotChris90 (2019-01-08T16:09:44Z) + +@fdncred definitely. I am just highly confused about the mkl libraries out there. + +is anaconda mkl the same like normal mkl and why there is no package for windows... the apt get installer also just download the file and put at specific locations... + +drives me crazy.... + +### Comment 35 by @fdncred (2019-01-08T16:47:58Z) + +@dotChris90 it appears to me that anaconda's MKL is just the regular MKL. It also looks to me like there is a windows package. See the links below. +https://anaconda.org/anaconda/mkl +https://docs.anaconda.com/accelerate/mkl-overview/ +https://repo.anaconda.com/pkgs/main/win-64/ +For my two cents, I think Proxem's BlasNet is the best wrapper for MKL. It looks pretty mature. +https://github.com/Proxem/BlasNet + +### Comment 36 by @dotChris90 (2019-01-08T21:13:48Z) + +@fdncred Thanks for the update. ;) + +From the URL I agree with you. 👍 +I already downloaded the package via pip and checked it but the package brings multiple MKL dlls. In anaconda location you will find binaries with mkl_corem mkl_xyz, …. about 6 or 7 files. But I though the mkl thing is one single DLL …. but anaconda shows multiple .... this is extrem strange behaviour... + +I agree Proxems BlasNet looks fine but it does not solve our main problem. Proxem just brings Wrapper code in C# - please do not misunderstand me but I am not very impressed by this …. because there are a lot of C# Code-Generators who do the same job - e.g. ClangSharp, T4, SWIG and if I check the Mono team I am 100% sure I can find more generators. xD Such automatic wrapper always simple take a C header file and generate Code …. I really do not see any benefit to use it BlasNet. I saw the Code and as far as I can see the main methods we can use could be also generated automaticly by ClangSharp (or T4) so not sure why add package for something we can auto generate xD. + +Our (at least what makes me feel uncomfortable) problem is : Proxem does not bring a native MKL Lib package. I have to install it manually. In Linux its easy - "sudo apt-get install" but on windows it is impossible to do this. This makes CI Testing impossible. How do we want to do unit testing or automatic benchmark testing on Appveyor? Unfortunately -.- we can not do this - except we package this MKL DLL into a nuget package. damn windows has no apt get.... + + +### Comment 37 by @fdncred (2019-01-08T22:08:23Z) + +Probably not impossible for CI. Have you looked at using chocolatey to install MKL? It looks like one of microsoft's packages includes it https://chocolatey.org/packages/microsoft-r-open. It may not be perfect but it may work. + +I've had a lot of experience with ClangSharp and NClang as well as other generators to take a C/C++ library to C# and I'm quite sure that they are not easy. I've found with one for months trying to get the library ported and it's very time consuming. You can get close pretty easily but you can't get complete easily. It'll take work for sure. + +### Comment 38 by @dotChris90 (2019-01-09T05:16:00Z) + +damn choco package management didn't think on it yes. can try. thanks. + +If u say it is hard maybe I was too easy thinking. the only complex thing we could have with code generation is.... lapack 100 % uses pointer. so generator can not know what's array and what pass by reference. + +hm...yes could be trickier. but as long as we just using some few functions from lapack.... writing own is easier. but yes maybe later need some more professional things. + +### Comment 39 by @fdncred (2019-01-09T13:56:05Z) + +Yes, IntPtr from C/C++ can be tricky and requires hand massaging for every call, from my experience. Marshalling arrays isn't too complex if you know the count of the array and the size of the array. Ref, In, Out params can be tricky, especially if you have an [In, Out] parameter in C/C++, where you pass in out value in a parameter and you return a different value out of the same parameter. If you get stuck on something reach out to me and I may be able to help. + +### Comment 40 by @Oceania2018 (2019-01-09T14:11:46Z) + +@fdncred can you help with +https://github.com/SciSharp/TensorFlow.NET/issues/86? + +### Comment 41 by @fdncred (2019-01-09T14:17:14Z) + +@Oceania2018, yes, i'll look at it. I'm not promising i can fix it but I'll try. ;) + +### Comment 42 by @Oceania2018 (2019-01-09T14:22:30Z) + +Anyway I’d appreciate. Try to make it work. Enjoy tensorflow.net. + +### Comment 43 by @dotChris90 (2019-01-10T06:06:45Z) + +for traceability. Intel just offer you help if u have customer service.. yeah every company need money I know.... + +But post in forum and got answer direct from Intel. + +https://software.intel.com/en-us/comment/1932183#comment-1932183 + +as we can read there. don't worry take the mkl lib. + +answers was (2019 Jan 10th, 7:09 Berlin time) + +please refer here : license FAQ + +you won't have a problem redistributing it. + +### Comment 44 by @mzhukova (2019-05-02T16:53:31Z) + +Hi folks, +I saw on the Intel forum that you were asking about distributing MKL via nuget. +It is available now in nuget channel as well. I was just wondering, if this may be useful to you: https://www.nuget.org/packages?q=intelmkl + +Best regards, +Maria diff --git a/docs/issues/issue-0129-doc-better-specification-for-all-classes-what-class-has-what-task.md b/docs/issues/issue-0129-doc-better-specification-for-all-classes-what-class-has-what-task.md index 04af6c0e..24748fd3 100644 --- a/docs/issues/issue-0129-doc-better-specification-for-all-classes-what-class-has-what-task.md +++ b/docs/issues/issue-0129-doc-better-specification-for-all-classes-what-class-has-what-task.md @@ -1,92 +1,92 @@ -# #129: Doc : Better specification for all classes (What class has what task) - -- **URL:** https://github.com/SciSharp/NumSharp/issues/129 -- **State:** OPEN -- **Author:** @dotChris90 -- **Created:** 2018-11-23T17:16:31Z -- **Updated:** 2018-12-14T12:25:49Z -- **Labels:** further discuss - -## Description - -Since now NumSharp offers a system for non generic, generic, dynamic and static we are in a good position for further dialog / discuss about classes tasks. -Moreover this issue can be used for the developer documentation. - -Let us call it "tidy up" and think about what we really need and most important need to think about the SW design. - -At the moment I see the following classes and their tasks - -- Storage (which could be a child of interface class IStorage) - - store the Data somehow (abstract said - concrete store in 1D System.Array) - - Get and Set Data in this Store (all at once or by indexing) - - convert Data to specific type -- Shape ( best practice would be child of IShape) - - store the dimensions of the array - - compute the index of a 1D array by multiple indexes if array is a multidimensional array - - compute the multiple indexes of multidimensional array from the index of 1D array -- Core.NDArray (non generic ) - - 1 NDArray has 1 Storage & 1 Shape - - delivers many methods for manipulate, processes, … 1 or N different Core.NDArrays. - - since its non generic elements are ValueTypes (must be cast to double etc.) -- Generic.NDArray - - children of Core.NDArray which offers possibility to direct indexing since elements are of generic parameter type - -@Oceania2018 @fdncred you 2 ;) please correct me if I wrote something wrong. - -@Oceania2018 Sorry for my stupid questions always - is there a reason that a Storage shall have a shape? Its really just a design question. I just think for Testability Classes shall be as independent as possible from each others. If they do not need a relationship then they should not have. From my point of view since NDArray has a shape, Storage does not need a shape. Storage shall not care about its Shape and just contain the elements. Just our best friend NDArray shall use Storage and Shape to bring elements in correct form. - -;) anyway guys have a good week and nice weekend. - - - - - -## Comments - -### Comment 1 by @Oceania2018 (2018-11-23T18:39:50Z) - -Excellent concept describing. For shape in storage, my idea is storage should be responsible for persisting and seeking data from any dimension and position, NDArray’s main responsibility is calculating, not seek data form storage. We are open for this topic. And NumPy is responsible for exposing interfaces to external invoking. - -### Comment 2 by @dotChris90 (2018-11-23T18:51:25Z) - -hm good point. - -from testability point of view storage should not have a shape. -from logic I am not sure. - -We keep issue open and I look again the code. what fits better. - -It's really just design question. user should not care this because they are not official Apis. - -### Comment 3 by @dotChris90 (2018-11-28T04:12:16Z) - -I come up with decision. - -I agree with you. the storage should be responsible for every data access and converting stuff. - -But then we must be careful. Ndarray shall have no own shape. if necessary it shall call methods from its storage object. dtype same. -ndarray must return the dtype of storage at e. g. it's property dtype. - -### Comment 4 by @dotChris90 (2018-12-14T12:24:42Z) - -@Oceania2018 @fdncred - -I added an interface for storage and one for shape. This is a future planning so the storage get easier and more clear to use. I come up with this because I noticed the storages methods sometimes not 100% well ..... most was my mistake -.- - -e.g. GetData() return the internal 1D array but! if dtype is corresponding to T its the reference array and if not its a copy .... the data types are correct but the underlying pointers are different ..... and since you all so interested in performance, memory, etc. such things can not be. - - -The interfaces are suggestions for next generation Storage lol https://github.com/SciSharp/NumSharp/blob/master/src/NumSharp.Core/Interfaces/IStorage.cs - -As you see I made up the following convensions : - -- new property TensorOrder (maybe should call it TensorLayout) -- Allocate will be used to choose Shape, data type and! TensorOrder -- GetData always return the reference of internal storage ALWAYS! -- if dtype is not equal to T in GetData< T > the internal storage is converted automaticly! -- New method CloneData which always will give you a copy of the internal storage and not storage itself -- so all in all GetData is copy by reference, CloneData is copy by value -- GetColumWiseStorage & GetRowWiseStorage methods return the instance itself but with column wise or row wise layout -- This layout stuff is extrem critical for LAPACK - including MKL! since they just accept rowwise and we at moment use columnwise ;) - - +# #129: Doc : Better specification for all classes (What class has what task) + +- **URL:** https://github.com/SciSharp/NumSharp/issues/129 +- **State:** OPEN +- **Author:** @dotChris90 +- **Created:** 2018-11-23T17:16:31Z +- **Updated:** 2018-12-14T12:25:49Z +- **Labels:** further discuss + +## Description + +Since now NumSharp offers a system for non generic, generic, dynamic and static we are in a good position for further dialog / discuss about classes tasks. +Moreover this issue can be used for the developer documentation. + +Let us call it "tidy up" and think about what we really need and most important need to think about the SW design. + +At the moment I see the following classes and their tasks + +- Storage (which could be a child of interface class IStorage) + - store the Data somehow (abstract said - concrete store in 1D System.Array) + - Get and Set Data in this Store (all at once or by indexing) + - convert Data to specific type +- Shape ( best practice would be child of IShape) + - store the dimensions of the array + - compute the index of a 1D array by multiple indexes if array is a multidimensional array + - compute the multiple indexes of multidimensional array from the index of 1D array +- Core.NDArray (non generic ) + - 1 NDArray has 1 Storage & 1 Shape + - delivers many methods for manipulate, processes, … 1 or N different Core.NDArrays. + - since its non generic elements are ValueTypes (must be cast to double etc.) +- Generic.NDArray + - children of Core.NDArray which offers possibility to direct indexing since elements are of generic parameter type + +@Oceania2018 @fdncred you 2 ;) please correct me if I wrote something wrong. + +@Oceania2018 Sorry for my stupid questions always - is there a reason that a Storage shall have a shape? Its really just a design question. I just think for Testability Classes shall be as independent as possible from each others. If they do not need a relationship then they should not have. From my point of view since NDArray has a shape, Storage does not need a shape. Storage shall not care about its Shape and just contain the elements. Just our best friend NDArray shall use Storage and Shape to bring elements in correct form. + +;) anyway guys have a good week and nice weekend. + + + + + +## Comments + +### Comment 1 by @Oceania2018 (2018-11-23T18:39:50Z) + +Excellent concept describing. For shape in storage, my idea is storage should be responsible for persisting and seeking data from any dimension and position, NDArray’s main responsibility is calculating, not seek data form storage. We are open for this topic. And NumPy is responsible for exposing interfaces to external invoking. + +### Comment 2 by @dotChris90 (2018-11-23T18:51:25Z) + +hm good point. + +from testability point of view storage should not have a shape. +from logic I am not sure. + +We keep issue open and I look again the code. what fits better. + +It's really just design question. user should not care this because they are not official Apis. + +### Comment 3 by @dotChris90 (2018-11-28T04:12:16Z) + +I come up with decision. + +I agree with you. the storage should be responsible for every data access and converting stuff. + +But then we must be careful. Ndarray shall have no own shape. if necessary it shall call methods from its storage object. dtype same. +ndarray must return the dtype of storage at e. g. it's property dtype. + +### Comment 4 by @dotChris90 (2018-12-14T12:24:42Z) + +@Oceania2018 @fdncred + +I added an interface for storage and one for shape. This is a future planning so the storage get easier and more clear to use. I come up with this because I noticed the storages methods sometimes not 100% well ..... most was my mistake -.- + +e.g. GetData() return the internal 1D array but! if dtype is corresponding to T its the reference array and if not its a copy .... the data types are correct but the underlying pointers are different ..... and since you all so interested in performance, memory, etc. such things can not be. + + +The interfaces are suggestions for next generation Storage lol https://github.com/SciSharp/NumSharp/blob/master/src/NumSharp.Core/Interfaces/IStorage.cs + +As you see I made up the following convensions : + +- new property TensorOrder (maybe should call it TensorLayout) +- Allocate will be used to choose Shape, data type and! TensorOrder +- GetData always return the reference of internal storage ALWAYS! +- if dtype is not equal to T in GetData< T > the internal storage is converted automaticly! +- New method CloneData which always will give you a copy of the internal storage and not storage itself +- so all in all GetData is copy by reference, CloneData is copy by value +- GetColumWiseStorage & GetRowWiseStorage methods return the instance itself but with column wise or row wise layout +- This layout stuff is extrem critical for LAPACK - including MKL! since they just accept rowwise and we at moment use columnwise ;) + + diff --git a/docs/issues/issue-0190-compressed-sparse-format.md b/docs/issues/issue-0190-compressed-sparse-format.md index c3da3bf0..a127441e 100644 --- a/docs/issues/issue-0190-compressed-sparse-format.md +++ b/docs/issues/issue-0190-compressed-sparse-format.md @@ -1,35 +1,35 @@ -# #190: Compressed Sparse Format - -- **URL:** https://github.com/SciSharp/NumSharp/issues/190 -- **State:** OPEN -- **Author:** @Oceania2018 -- **Created:** 2019-01-09T21:45:32Z -- **Updated:** 2019-04-16T16:00:05Z -- **Labels:** enhancement -- **Assignees:** @dotChris90 -- **Milestone:** v0.7 - -## Description - -We should implement the compressed ndarray, it is used widely in scikit-learn. The csr_matrix is included in SciPy not NumPy, but I think we should move it into NumSharp. @dotChris90 What do you think of it? - -[Compressed Sparse Column Format (CSC)](https://www.scipy-lectures.org/advanced/scipy_sparse/csc_matrix.html) -[Compressed Sparse Row Format (CSR)](https://www.scipy-lectures.org/advanced/scipy_sparse/csr_matrix.html) - -https://www.scipy-lectures.org/advanced/scipy_sparse/storage_schemes.html - -## Comments - -### Comment 1 by @Deep-Blue-2013 (2019-01-09T21:47:51Z) - -CSC format saved memory a lot. Looking forward to see this feature. - -### Comment 2 by @sebhofer (2019-04-16T13:38:38Z) - -Would be great to have an sparse matrix implementation with good performance! Math.Net has some support for sparse matrices, but performance is not great. Also, would be useful to have support for different storage formats (as you already hinted at above). - -As an additional reference: [Here](https://github.com/wo80/mathnet-extensions) is an implementation improving on the performance of Math.Net. - -### Comment 3 by @Oceania2018 (2019-04-16T16:00:05Z) - -@sebhofer Thanks for the info, it's important to us. +# #190: Compressed Sparse Format + +- **URL:** https://github.com/SciSharp/NumSharp/issues/190 +- **State:** OPEN +- **Author:** @Oceania2018 +- **Created:** 2019-01-09T21:45:32Z +- **Updated:** 2019-04-16T16:00:05Z +- **Labels:** enhancement +- **Assignees:** @dotChris90 +- **Milestone:** v0.7 + +## Description + +We should implement the compressed ndarray, it is used widely in scikit-learn. The csr_matrix is included in SciPy not NumPy, but I think we should move it into NumSharp. @dotChris90 What do you think of it? + +[Compressed Sparse Column Format (CSC)](https://www.scipy-lectures.org/advanced/scipy_sparse/csc_matrix.html) +[Compressed Sparse Row Format (CSR)](https://www.scipy-lectures.org/advanced/scipy_sparse/csr_matrix.html) + +https://www.scipy-lectures.org/advanced/scipy_sparse/storage_schemes.html + +## Comments + +### Comment 1 by @Deep-Blue-2013 (2019-01-09T21:47:51Z) + +CSC format saved memory a lot. Looking forward to see this feature. + +### Comment 2 by @sebhofer (2019-04-16T13:38:38Z) + +Would be great to have an sparse matrix implementation with good performance! Math.Net has some support for sparse matrices, but performance is not great. Also, would be useful to have support for different storage formats (as you already hinted at above). + +As an additional reference: [Here](https://github.com/wo80/mathnet-extensions) is an implementation improving on the performance of Math.Net. + +### Comment 3 by @Oceania2018 (2019-04-16T16:00:05Z) + +@sebhofer Thanks for the info, it's important to us. diff --git a/docs/issues/issue-0202-implement-np.pad.md b/docs/issues/issue-0202-implement-np.pad.md index 6c83840a..52f4bb95 100644 --- a/docs/issues/issue-0202-implement-np.pad.md +++ b/docs/issues/issue-0202-implement-np.pad.md @@ -1,25 +1,25 @@ -# #202: implement np.pad +# #202: implement np.pad + +- **URL:** https://github.com/SciSharp/NumSharp/issues/202 +- **State:** OPEN +- **Author:** @skywalkerisnull +- **Created:** 2019-03-03T04:25:59Z +- **Updated:** 2019-03-10T01:06:49Z +- **Labels:** enhancement +- **Assignees:** @KevinMa0207 +- **Milestone:** v0.7.5 + +## Description + +Add a buffer or padding around a numpy array: +https://docs.scipy.org/doc/numpy/reference/generated/numpy.pad.html + +## Comments + +### Comment 1 by @Oceania2018 (2019-03-03T15:13:32Z) + +```python +a = [1, 2, 3, 4, 5] +np.pad(a, (2,3), 'constant', constant_values=(4, 6)) -- **URL:** https://github.com/SciSharp/NumSharp/issues/202 -- **State:** OPEN -- **Author:** @skywalkerisnull -- **Created:** 2019-03-03T04:25:59Z -- **Updated:** 2019-03-10T01:06:49Z -- **Labels:** enhancement -- **Assignees:** @KevinMa0207 -- **Milestone:** v0.7.5 - -## Description - -Add a buffer or padding around a numpy array: -https://docs.scipy.org/doc/numpy/reference/generated/numpy.pad.html - -## Comments - -### Comment 1 by @Oceania2018 (2019-03-03T15:13:32Z) - -```python -a = [1, 2, 3, 4, 5] -np.pad(a, (2,3), 'constant', constant_values=(4, 6)) - -``` +``` diff --git a/docs/issues/issue-0210-add-numpy.all.md b/docs/issues/issue-0210-add-numpy.all.md index 332f2de1..e164b92c 100644 --- a/docs/issues/issue-0210-add-numpy.all.md +++ b/docs/issues/issue-0210-add-numpy.all.md @@ -1,20 +1,20 @@ -# #210: Add numpy.all - -- **URL:** https://github.com/SciSharp/NumSharp/issues/210 -- **State:** OPEN -- **Author:** @Esther2013 -- **Created:** 2019-03-10T04:32:04Z -- **Updated:** 2019-04-05T07:56:30Z -- **Assignees:** @Oceania2018, @KevinMa0207 - -## Description - -Test whether all array elements along a given axis evaluate to True. -`np.all([[True,False],[True,True]])` -https://docs.scipy.org/doc/numpy/reference/generated/numpy.all.html - -## Comments - -### Comment 1 by @henon (2019-04-05T07:56:30Z) - -I just implemented this, but without axis support at the moment. The overload with axis is still to be done +# #210: Add numpy.all + +- **URL:** https://github.com/SciSharp/NumSharp/issues/210 +- **State:** OPEN +- **Author:** @Esther2013 +- **Created:** 2019-03-10T04:32:04Z +- **Updated:** 2019-04-05T07:56:30Z +- **Assignees:** @Oceania2018, @KevinMa0207 + +## Description + +Test whether all array elements along a given axis evaluate to True. +`np.all([[True,False],[True,True]])` +https://docs.scipy.org/doc/numpy/reference/generated/numpy.all.html + +## Comments + +### Comment 1 by @henon (2019-04-05T07:56:30Z) + +I just implemented this, but without axis support at the moment. The overload with axis is still to be done diff --git a/docs/issues/issue-0211-implement-scipy-interpolate.md b/docs/issues/issue-0211-implement-scipy-interpolate.md index 8dac9705..694b78a2 100644 --- a/docs/issues/issue-0211-implement-scipy-interpolate.md +++ b/docs/issues/issue-0211-implement-scipy-interpolate.md @@ -1,32 +1,32 @@ -# #211: implement scipy interpolate? - -- **URL:** https://github.com/SciSharp/NumSharp/issues/211 -- **State:** OPEN -- **Author:** @xinqipony -- **Created:** 2019-03-12T02:27:15Z -- **Updated:** 2019-03-26T05:14:11Z -- **Labels:** enhancement -- **Assignees:** @Oceania2018 - -## Description - -this is an amazing project and any plan to implement scipy interpolate? - -## Comments - -### Comment 1 by @Oceania2018 (2019-03-12T02:50:02Z) - -Will do `Interpolate a 1-D function.` and `2-D` - -### Comment 2 by @Oceania2018 (2019-03-26T04:37:13Z) - -@xinqipony Is https://docs.scipy.org/doc/numpy/reference/generated/numpy.interp.html you want? - -### Comment 3 by @xinqipony (2019-03-26T05:09:21Z) - -yes, this is what I used: -interpolate.interp1d(x, y, kind='cubic', axis=0), - -in the meantime, I use MathNet now, but its implementation is not so good and not easy to use, - -look forward to your new updates! +# #211: implement scipy interpolate? + +- **URL:** https://github.com/SciSharp/NumSharp/issues/211 +- **State:** OPEN +- **Author:** @xinqipony +- **Created:** 2019-03-12T02:27:15Z +- **Updated:** 2019-03-26T05:14:11Z +- **Labels:** enhancement +- **Assignees:** @Oceania2018 + +## Description + +this is an amazing project and any plan to implement scipy interpolate? + +## Comments + +### Comment 1 by @Oceania2018 (2019-03-12T02:50:02Z) + +Will do `Interpolate a 1-D function.` and `2-D` + +### Comment 2 by @Oceania2018 (2019-03-26T04:37:13Z) + +@xinqipony Is https://docs.scipy.org/doc/numpy/reference/generated/numpy.interp.html you want? + +### Comment 3 by @xinqipony (2019-03-26T05:09:21Z) + +yes, this is what I used: +interpolate.interp1d(x, y, kind='cubic', axis=0), + +in the meantime, I use MathNet now, but its implementation is not so good and not easy to use, + +look forward to your new updates! diff --git a/docs/issues/issue-0220-numpy.flip.md b/docs/issues/issue-0220-numpy.flip.md index e44c18e9..717bc120 100644 --- a/docs/issues/issue-0220-numpy.flip.md +++ b/docs/issues/issue-0220-numpy.flip.md @@ -1,20 +1,20 @@ -# #220: numpy.flip - -- **URL:** https://github.com/SciSharp/NumSharp/issues/220 -- **State:** OPEN -- **Author:** @pkingwsd -- **Created:** 2019-03-21T03:29:13Z -- **Updated:** 2019-06-15T04:49:17Z -- **Labels:** enhancement -- **Assignees:** @yanglr - -## Description - -numpy.flip - -## Comments - -### Comment 1 by @Oceania2018 (2019-03-21T03:31:07Z) - -https://docs.scipy.org/doc/numpy/reference/generated/numpy.flip.html -Please also past the python link, thanks. +# #220: numpy.flip + +- **URL:** https://github.com/SciSharp/NumSharp/issues/220 +- **State:** OPEN +- **Author:** @pkingwsd +- **Created:** 2019-03-21T03:29:13Z +- **Updated:** 2019-06-15T04:49:17Z +- **Labels:** enhancement +- **Assignees:** @yanglr + +## Description + +numpy.flip + +## Comments + +### Comment 1 by @Oceania2018 (2019-03-21T03:31:07Z) + +https://docs.scipy.org/doc/numpy/reference/generated/numpy.flip.html +Please also past the python link, thanks. diff --git a/docs/issues/issue-0238-how-to-mimic-pythons-nice-column-and-row-access-i.e-matrix-2.md b/docs/issues/issue-0238-how-to-mimic-pythons-nice-column-and-row-access-i.e-matrix-2.md index f15caa6b..1eba9bdc 100644 --- a/docs/issues/issue-0238-how-to-mimic-pythons-nice-column-and-row-access-i.e-matrix-2.md +++ b/docs/issues/issue-0238-how-to-mimic-pythons-nice-column-and-row-access-i.e-matrix-2.md @@ -1,401 +1,401 @@ -# #238: How to mimic Python's nice column and row access (i.e matrix[:, 2])? +# #238: How to mimic Python's nice column and row access (i.e matrix[:, 2])? + +- **URL:** https://github.com/SciSharp/NumSharp/issues/238 +- **State:** OPEN +- **Author:** @henon +- **Created:** 2019-04-05T08:08:30Z +- **Updated:** 2020-02-08T11:40:24Z +- **Labels:** help wanted +- **Assignees:** @henon +- **Milestone:** v0.9 Multiple Backends + +## Description + +Hey all, + +How would you say to do access to a column `matrix[:, i]` or access to a row `matrix[i, :]` in NumSharp? + + +## Comments + +### Comment 1 by @henon (2019-04-05T11:21:07Z) + +I need to be able to get a (n-1)-dimensional slice of a n-dimensional matrix, i.e. a 1d vector out of a 2d matrix. +First step would be to add appropriate accessors to IStorage right? +I am not yet sure how they should look like, please comment if you have ideas. + +### Comment 2 by @henon (2019-04-05T11:35:01Z) + +This is not as elegantly possible as in Python, but we can do something like this, given that matrix is an NDArray: + +* matrix[Range.All, 1] ... return the first column, Python: matrix[:, 1] +* matrix[new Range(0, 2), 1] ... return the first two entries of the first column, Python: matrix[:2, 1] +* matrix[new Range(1,3), new Range(1,3)] ... return a 2x2 submatrix of matrix starting at 1,1, Python: matrix[1:3, 1:3] + + +### Comment 3 by @Oceania2018 (2019-04-05T11:35:18Z) + +Check `indexing` to help. +![image](https://user-images.githubusercontent.com/1705364/55624849-c97ce200-576c-11e9-8b03-5b4cac0766b0.png) + +We can override in `Slice` +![image](https://user-images.githubusercontent.com/1705364/55624914-f03b1880-576c-11e9-9456-2b4e97c17077.png) + +Or we can pass string `":1"`. + +### Comment 4 by @henon (2019-04-05T11:40:45Z) + +Yeah, the string idea is great for porting code from Python. I am sure it will be popular. + +### Comment 5 by @Oceania2018 (2019-04-05T11:43:02Z) + +Seem's like another contributor already implemented the string index. I'll found out later. @PppBr is that true? + +### Comment 6 by @henon (2019-04-05T11:45:05Z) + +when you slice a matrix in numpy you essentially get a view of the original data. modifying it will modify the original matrix. Do we have a view concept or implementation already? + +### Comment 7 by @Oceania2018 (2019-04-05T11:50:46Z) + +Not yet, we havn't have the `view` class. I've an idea how to implement the new `view`. + +`view` inherit from `ndarray`, but keep a `filter` of data index. +and `view` will implement a `IEnumerate` interface. +when interating the `view`, it will return all the element in the `filter`. +and view don't need copy the memory. change data will reflect in the original memory. + +@henon What do you think of it? + +or we need a new `NDStorage`? + +### Comment 8 by @henon (2019-04-05T12:14:49Z) + +@Oceania2018: I think the projection from the view to the original data could be handled entirely by the storage. + +This is complicated, I had to think about it for a time to wrap my head around it. If I am correct, what you need is a function that projects a view index onto an index on the original data (which could be another view that does further projection - think about that). + +I am not yet sure how that function looks like if you i.e. for instance get a 1D slice out of a 17-dimensional matrix but once we have that generic formula we can easily project view_index to underlying data_index and view_index+1, view_index+2, ... etc. to enumerate it. + + + + + + + +### Comment 9 by @Oceania2018 (2019-04-05T12:17:40Z) + +Actually, we have the formula to convert n-d index to 1d index and wise-verse. +chech the function `Shape.GetDimIndexOutShape` +So don't worry about the dimension. the storage is persistent data in 1d array. + +I still think the `view` should inherit from `ndarray` with a `filters` in `view` instance, not in `ndstorage` level. Let's keep this talk open. + +### Comment 10 by @henon (2019-04-05T12:47:10Z) + +Nice we have the projection and the inverse projection already, so the difficult part is actually already solved. The rest is just software design. + +One thing I missed, that the view also needs to enumerate on the underlying data (or view), is a stride. If you take a row out of a matrix the stride is 1, but if you take a column, the stride is the width of the matrix. + +ok, you may be right about inheriting from ndarray. I have only limited knowledge about the design at this point, so I trust your judgement. + +### Comment 11 by @Oceania2018 (2019-04-05T13:01:13Z) + +I will write the first version of view, then we can discuss further. + +### Comment 12 by @henon (2019-04-05T13:25:41Z) + +Don't forget to make the design recursive, so that you can have a `view` of a `view` of a `view` of a 'storage'. + +### Comment 13 by @Oceania2018 (2019-04-05T14:00:16Z) + +Sure + +### Comment 14 by @henon (2019-04-08T09:51:45Z) + +Update: Python's slice notation for accessing slices of NDArray has been implemented. However, the implementation of a view that serves that slice of the original data still needs to be done. + +Here is a very simple test case that demonstrates the problem to be solved: +```[TestMethod] + public void GetAColumnOf2dMatrix() + { + var x = np.arange(9).reshape(3, 3); + var v = x[":, 1"]; + Assert.IsTrue(Enumerable.SequenceEqual( v.Data(), new double[]{ 1, 4, 7 })); + v[1] = 99; + Assert.AreEqual(99, x[1,1]); + } +``` + +### Comment 15 by @Oceania2018 (2019-04-27T16:46:05Z) + +Check the `Slice3x2x2` UnitTest. + +### Comment 16 by @Rikki-Tavi (2020-02-07T03:35:42Z) + + +I have been wrestling with the same (or similar) issue in the context of trying to generate randomized mini-batches using NumSharp. +The python code I am trying to emulate looks like this: + +def random_mini_batches(X, Y, mini_batch_size = 64): + """ + Creates a list of random minibatches from (X, Y) + + Arguments: + X -- input data, of shape (input size, number of examples) + Y -- true "label" vector of shape (1, number of examples) + mini_batch_size - size of the mini-batches, integer + + Returns: + mini_batches -- list of synchronous (mini_batch_X, mini_batch_Y) + """ + + m = X.shape[1] # number of training examples + mini_batches = [] + + # Step 1: Shuffle (X, Y) + permutation = list(np.random.permutation(m)) + + shuffled_X = X[:, permutation] + shuffled_Y = Y[:, permutation].reshape((Y.shape[0],m)) + + # Step 2: Partition (shuffled_X, shuffled_Y). Minus the end case. + num_complete_minibatches = math.floor(m/mini_batch_size) # number of mini batches of size mini_batch_size in your partitionning + for k in range(0, num_complete_minibatches): + mini_batch_X = shuffled_X[:, k * mini_batch_size : k * mini_batch_size + mini_batch_size] + mini_batch_Y = shuffled_Y[:, k * mini_batch_size : k * mini_batch_size + mini_batch_size] + mini_batch = (mini_batch_X, mini_batch_Y) + mini_batches.append(mini_batch) + + # Handling the end case (last mini-batch < mini_batch_size) + if m % mini_batch_size != 0: + mini_batch_X = shuffled_X[:, num_complete_minibatches * mini_batch_size : m] + mini_batch_Y = shuffled_Y[:, num_complete_minibatches * mini_batch_size : m] + mini_batch = (mini_batch_X, mini_batch_Y) + mini_batches.append(mini_batch) + + return mini_batches + +The part I have trouble emulating with NumSharp is: + + shuffled_X = X[:, permutation] + shuffled_Y = Y[:, permutation].reshape((Y.shape[0],m)) + +The closest I have been able to get is: + + var shuffled_X = new NDArray(np.float32, X.shape); + for (int i = 0; i < X.shape[0]; i++) + { + shuffled_X[i] = X[i][permutation]; + } + + var shuffled_Y = new NDArray(np.float32, Y.shape); + for (int i = 0; i < Y.shape[0]; i++) + { + shuffled_Y[i] = Y[i][permutation]; + } + shuffled_Y = shuffled_Y.reshape((Y.shape[0], m)); + +Which works, but is much, much slower (also true when I implement the alternative in Python). + +The problem with NumSharp is that I cannot put the indexer ":, permutation" in quotes. I've tried converting 'permutation' to its string-expanded list equivalent (so that I can have a totally string-based indexer that NumSharp likes) but I don't seem to be able to arrive at a string-serialized encoding of 'permutation' inside the resulting indexer that doesn't make NumSharp crash. + +Am I overlooking an obvious solution here? + +### Comment 17 by @Oceania2018 (2020-02-07T04:20:06Z) + +@BillyDJr Try +```csharp +shuffled_X = X[Slice.All, new Slice(permutation)]; +``` + +### Comment 18 by @Rikki-Tavi (2020-02-07T05:50:40Z) + +Trying that yielded: +`NumSharp.IncorrectShapeException: 'This method does not work with this shape or was not already implemented.'` + + +### Comment 19 by @henon (2020-02-07T07:50:54Z) + +> @BillyDJr Try +> +> ```cs +> shuffled_X = X[Slice.All, new Slice(permutation)]; +> ``` + +No, he needs index access to get shuffled data. It should be + +```cs +shuffled_X = X[Slice.All, new NDArray(permutation)]; +``` + +### Comment 20 by @Rikki-Tavi (2020-02-07T21:11:11Z) + +I simplified my Python target test case, showing two ways to generate the shuffled Xs and Ys. +m = 4 +X = np.random.rand(3,m) +Y = np.random.rand(1,m) +permutation = list(np.random.permutation(m)) +print ("perm: " + str(permutation)) +print ("X: " + str(X)) +print ("Y: " + str(Y)) +shuffled_X1 = X[:, permutation] +shuffled_X2 = X.copy() +for i in range(0, X.shape[0]): + shuffled_X2[i] = X[i][permutation] + +print("shuffled_X1: " + str(shuffled_X1)) +print("shuffled_X2: " + str(shuffled_X2)) + +shuffled_Y1 = Y[:, permutation].reshape((Y.shape[0],m)) +shuffled_Y2 = Y.copy() +for i in range(0, Y.shape[0]): + shuffled_Y2[i] = Y[i][permutation] +shuffled_Y2 = shuffled_Y2.reshape((Y.shape[0], m)) + +print("shuffled_Y1 " + str(shuffled_Y1)) +print("shuffled_Y2 " + str(shuffled_Y2)) + +And the results: +perm: [2, 1, 3, 0] +X: [[0.14038694 0.19810149 0.80074457 0.96826158] + [0.31342418 0.69232262 0.87638915 0.89460666] + [0.08504421 0.03905478 0.16983042 0.8781425 ]] +Y: [[0.09834683 0.42110763 0.95788953 0.53316528]] +shuffled_X1: [[0.80074457 0.19810149 0.96826158 0.14038694] + [0.87638915 0.69232262 0.89460666 0.31342418] + [0.16983042 0.03905478 0.8781425 0.08504421]] +shuffled_X2: [[0.80074457 0.19810149 0.96826158 0.14038694] + [0.87638915 0.69232262 0.89460666 0.31342418] + [0.16983042 0.03905478 0.8781425 0.08504421]] +shuffled_Y1 [[0.95788953 0.42110763 0.53316528 0.09834683]] +shuffled_Y2 [[0.95788953 0.42110763 0.53316528 0.09834683]] + +Here is the C# code (just showing the Xs for the sake of brevity). Note the shuffled_X2 works (as I reported before, but it runs too slowly for large datasets). As you can see, I try various stabs at arriving at shuffled_X1, all failing: + + var m = 4; + var X = np.random.rand(3, m); + var permutation = np.random.permutation(m); + + print($"perm: {permutation}"); + print($"X: {X}"); + + // In Python: shuffled_X1 = X[:, permutation] + try + { + var shuffled_X1 = X[Slice.All, permutation]; + print($"shuffled_X1: {shuffled_X1}"); + } + catch (Exception ex) + { + print($"Param as: raw permutation - error: {ex.Message}"); + } + + try + { + var shuffled_X1 = X[Slice.All, new Slice(permutation)]; + print($"shuffled_X1: {shuffled_X1}"); + } + catch (Exception ex) + { + print($"Param as: new Slice(permutation) - error: {ex.Message}"); + } + + try + { + var shuffled_X1 = X[Slice.All, new NDArray(permutation.ToArray())]; + print($"shuffled_X1: {shuffled_X1}"); + } + catch (Exception ex) + { + print($"Param as: new NDArray(permutation.ToArray()) - error: {ex.Message}"); + } + + try + { + var shuffled_X1 = X[Slice.All, new NDArray(permutation.CloneData())]; + print($"shuffled_X1: {shuffled_X1}"); + } + catch (Exception ex) + { + print($"Param as: new NDArray(permutation.CloneData()) - error: {ex.Message}"); + } + + try + { + var shuffled_X1 = X[Slice.All, new NDArray(Binding.list(permutation.ToArray()))]; + print($"shuffled_X1: {shuffled_X1}"); + } + catch (Exception ex) + { + print($"Param as: new NDArray(Binding.list(permutation.ToArray())) - error: {ex.Message}"); + } + + var shuffled_X2 = new NDArray(np.float32, X.shape); + for (int i=0; i()) - error: shape mismatch: objects cannot be broadcast to a single shape +Param as: new NDArray(permutation.CloneData()) - error: shape mismatch: objects cannot be broadcast to a single shape +Param as: new NDArray(Binding.list(permutation.ToArray())) - error: shape mismatch: objects cannot be broadcast to a single shape +shuffled_X2: [[0.03434474, 0.8834703, 0.5201029, 0.55567724], +[0.6067407, 0.7806033, 0.3361534, 0.7949469], +[0.60182047, 0.11560028, 0.83518714, 0.2805164]] + +Are there any other variations I should try? + + + + +### Comment 21 by @Rikki-Tavi (2020-02-08T04:45:32Z) + +FWIW....It was easy to get working with Numpy.NET: + + [TestMethod] + public void mytest() { + var m = 4; + var X = np.random.rand(3, m); + var permutation = np.random.permutation(m); + + print($"perm: {permutation}"); + print($"X: {X}"); + + var shuffled_X = X[":", permutation]; + print($"shuffled_X: {shuffled_X}"); + } + + private void print (string output) + { + System.Diagnostics.Debug.WriteLine(output); + } + +Resulted in: -- **URL:** https://github.com/SciSharp/NumSharp/issues/238 -- **State:** OPEN -- **Author:** @henon -- **Created:** 2019-04-05T08:08:30Z -- **Updated:** 2020-02-08T11:40:24Z -- **Labels:** help wanted -- **Assignees:** @henon -- **Milestone:** v0.9 Multiple Backends - -## Description - -Hey all, - -How would you say to do access to a column `matrix[:, i]` or access to a row `matrix[i, :]` in NumSharp? - - -## Comments - -### Comment 1 by @henon (2019-04-05T11:21:07Z) - -I need to be able to get a (n-1)-dimensional slice of a n-dimensional matrix, i.e. a 1d vector out of a 2d matrix. -First step would be to add appropriate accessors to IStorage right? -I am not yet sure how they should look like, please comment if you have ideas. - -### Comment 2 by @henon (2019-04-05T11:35:01Z) - -This is not as elegantly possible as in Python, but we can do something like this, given that matrix is an NDArray: - -* matrix[Range.All, 1] ... return the first column, Python: matrix[:, 1] -* matrix[new Range(0, 2), 1] ... return the first two entries of the first column, Python: matrix[:2, 1] -* matrix[new Range(1,3), new Range(1,3)] ... return a 2x2 submatrix of matrix starting at 1,1, Python: matrix[1:3, 1:3] - - -### Comment 3 by @Oceania2018 (2019-04-05T11:35:18Z) - -Check `indexing` to help. -![image](https://user-images.githubusercontent.com/1705364/55624849-c97ce200-576c-11e9-8b03-5b4cac0766b0.png) - -We can override in `Slice` -![image](https://user-images.githubusercontent.com/1705364/55624914-f03b1880-576c-11e9-9456-2b4e97c17077.png) - -Or we can pass string `":1"`. - -### Comment 4 by @henon (2019-04-05T11:40:45Z) - -Yeah, the string idea is great for porting code from Python. I am sure it will be popular. - -### Comment 5 by @Oceania2018 (2019-04-05T11:43:02Z) - -Seem's like another contributor already implemented the string index. I'll found out later. @PppBr is that true? - -### Comment 6 by @henon (2019-04-05T11:45:05Z) - -when you slice a matrix in numpy you essentially get a view of the original data. modifying it will modify the original matrix. Do we have a view concept or implementation already? - -### Comment 7 by @Oceania2018 (2019-04-05T11:50:46Z) - -Not yet, we havn't have the `view` class. I've an idea how to implement the new `view`. - -`view` inherit from `ndarray`, but keep a `filter` of data index. -and `view` will implement a `IEnumerate` interface. -when interating the `view`, it will return all the element in the `filter`. -and view don't need copy the memory. change data will reflect in the original memory. - -@henon What do you think of it? - -or we need a new `NDStorage`? - -### Comment 8 by @henon (2019-04-05T12:14:49Z) - -@Oceania2018: I think the projection from the view to the original data could be handled entirely by the storage. - -This is complicated, I had to think about it for a time to wrap my head around it. If I am correct, what you need is a function that projects a view index onto an index on the original data (which could be another view that does further projection - think about that). - -I am not yet sure how that function looks like if you i.e. for instance get a 1D slice out of a 17-dimensional matrix but once we have that generic formula we can easily project view_index to underlying data_index and view_index+1, view_index+2, ... etc. to enumerate it. - - - - - - - -### Comment 9 by @Oceania2018 (2019-04-05T12:17:40Z) - -Actually, we have the formula to convert n-d index to 1d index and wise-verse. -chech the function `Shape.GetDimIndexOutShape` -So don't worry about the dimension. the storage is persistent data in 1d array. - -I still think the `view` should inherit from `ndarray` with a `filters` in `view` instance, not in `ndstorage` level. Let's keep this talk open. - -### Comment 10 by @henon (2019-04-05T12:47:10Z) - -Nice we have the projection and the inverse projection already, so the difficult part is actually already solved. The rest is just software design. - -One thing I missed, that the view also needs to enumerate on the underlying data (or view), is a stride. If you take a row out of a matrix the stride is 1, but if you take a column, the stride is the width of the matrix. - -ok, you may be right about inheriting from ndarray. I have only limited knowledge about the design at this point, so I trust your judgement. - -### Comment 11 by @Oceania2018 (2019-04-05T13:01:13Z) - -I will write the first version of view, then we can discuss further. - -### Comment 12 by @henon (2019-04-05T13:25:41Z) - -Don't forget to make the design recursive, so that you can have a `view` of a `view` of a `view` of a 'storage'. - -### Comment 13 by @Oceania2018 (2019-04-05T14:00:16Z) - -Sure - -### Comment 14 by @henon (2019-04-08T09:51:45Z) - -Update: Python's slice notation for accessing slices of NDArray has been implemented. However, the implementation of a view that serves that slice of the original data still needs to be done. - -Here is a very simple test case that demonstrates the problem to be solved: -```[TestMethod] - public void GetAColumnOf2dMatrix() - { - var x = np.arange(9).reshape(3, 3); - var v = x[":, 1"]; - Assert.IsTrue(Enumerable.SequenceEqual( v.Data(), new double[]{ 1, 4, 7 })); - v[1] = 99; - Assert.AreEqual(99, x[1,1]); - } ``` - -### Comment 15 by @Oceania2018 (2019-04-27T16:46:05Z) - -Check the `Slice3x2x2` UnitTest. - -### Comment 16 by @Rikki-Tavi (2020-02-07T03:35:42Z) - - -I have been wrestling with the same (or similar) issue in the context of trying to generate randomized mini-batches using NumSharp. -The python code I am trying to emulate looks like this: - -def random_mini_batches(X, Y, mini_batch_size = 64): - """ - Creates a list of random minibatches from (X, Y) - - Arguments: - X -- input data, of shape (input size, number of examples) - Y -- true "label" vector of shape (1, number of examples) - mini_batch_size - size of the mini-batches, integer - - Returns: - mini_batches -- list of synchronous (mini_batch_X, mini_batch_Y) - """ - - m = X.shape[1] # number of training examples - mini_batches = [] - - # Step 1: Shuffle (X, Y) - permutation = list(np.random.permutation(m)) - - shuffled_X = X[:, permutation] - shuffled_Y = Y[:, permutation].reshape((Y.shape[0],m)) - - # Step 2: Partition (shuffled_X, shuffled_Y). Minus the end case. - num_complete_minibatches = math.floor(m/mini_batch_size) # number of mini batches of size mini_batch_size in your partitionning - for k in range(0, num_complete_minibatches): - mini_batch_X = shuffled_X[:, k * mini_batch_size : k * mini_batch_size + mini_batch_size] - mini_batch_Y = shuffled_Y[:, k * mini_batch_size : k * mini_batch_size + mini_batch_size] - mini_batch = (mini_batch_X, mini_batch_Y) - mini_batches.append(mini_batch) - - # Handling the end case (last mini-batch < mini_batch_size) - if m % mini_batch_size != 0: - mini_batch_X = shuffled_X[:, num_complete_minibatches * mini_batch_size : m] - mini_batch_Y = shuffled_Y[:, num_complete_minibatches * mini_batch_size : m] - mini_batch = (mini_batch_X, mini_batch_Y) - mini_batches.append(mini_batch) - - return mini_batches - -The part I have trouble emulating with NumSharp is: - - shuffled_X = X[:, permutation] - shuffled_Y = Y[:, permutation].reshape((Y.shape[0],m)) - -The closest I have been able to get is: - - var shuffled_X = new NDArray(np.float32, X.shape); - for (int i = 0; i < X.shape[0]; i++) - { - shuffled_X[i] = X[i][permutation]; - } - - var shuffled_Y = new NDArray(np.float32, Y.shape); - for (int i = 0; i < Y.shape[0]; i++) - { - shuffled_Y[i] = Y[i][permutation]; - } - shuffled_Y = shuffled_Y.reshape((Y.shape[0], m)); - -Which works, but is much, much slower (also true when I implement the alternative in Python). - -The problem with NumSharp is that I cannot put the indexer ":, permutation" in quotes. I've tried converting 'permutation' to its string-expanded list equivalent (so that I can have a totally string-based indexer that NumSharp likes) but I don't seem to be able to arrive at a string-serialized encoding of 'permutation' inside the resulting indexer that doesn't make NumSharp crash. - -Am I overlooking an obvious solution here? - -### Comment 17 by @Oceania2018 (2020-02-07T04:20:06Z) - -@BillyDJr Try -```csharp -shuffled_X = X[Slice.All, new Slice(permutation)]; -``` - -### Comment 18 by @Rikki-Tavi (2020-02-07T05:50:40Z) - -Trying that yielded: -`NumSharp.IncorrectShapeException: 'This method does not work with this shape or was not already implemented.'` - - -### Comment 19 by @henon (2020-02-07T07:50:54Z) - -> @BillyDJr Try -> -> ```cs -> shuffled_X = X[Slice.All, new Slice(permutation)]; -> ``` - -No, he needs index access to get shuffled data. It should be - -```cs -shuffled_X = X[Slice.All, new NDArray(permutation)]; +perm: [3 0 1 2] +X: [[0.58033439 0.99341353 0.77685615 0.1893294 ] + [0.81824309 0.7315536 0.64120989 0.97876454] + [0.15659539 0.9045345 0.83839889 0.43254176]] +shuffled_X: [[0.1893294 0.58033439 0.99341353 0.77685615] + [0.97876454 0.81824309 0.7315536 0.64120989] + [0.43254176 0.15659539 0.9045345 0.83839889]] ``` - -### Comment 20 by @Rikki-Tavi (2020-02-07T21:11:11Z) - -I simplified my Python target test case, showing two ways to generate the shuffled Xs and Ys. -m = 4 -X = np.random.rand(3,m) -Y = np.random.rand(1,m) -permutation = list(np.random.permutation(m)) -print ("perm: " + str(permutation)) -print ("X: " + str(X)) -print ("Y: " + str(Y)) -shuffled_X1 = X[:, permutation] -shuffled_X2 = X.copy() -for i in range(0, X.shape[0]): - shuffled_X2[i] = X[i][permutation] - -print("shuffled_X1: " + str(shuffled_X1)) -print("shuffled_X2: " + str(shuffled_X2)) - -shuffled_Y1 = Y[:, permutation].reshape((Y.shape[0],m)) -shuffled_Y2 = Y.copy() -for i in range(0, Y.shape[0]): - shuffled_Y2[i] = Y[i][permutation] -shuffled_Y2 = shuffled_Y2.reshape((Y.shape[0], m)) - -print("shuffled_Y1 " + str(shuffled_Y1)) -print("shuffled_Y2 " + str(shuffled_Y2)) - -And the results: -perm: [2, 1, 3, 0] -X: [[0.14038694 0.19810149 0.80074457 0.96826158] - [0.31342418 0.69232262 0.87638915 0.89460666] - [0.08504421 0.03905478 0.16983042 0.8781425 ]] -Y: [[0.09834683 0.42110763 0.95788953 0.53316528]] -shuffled_X1: [[0.80074457 0.19810149 0.96826158 0.14038694] - [0.87638915 0.69232262 0.89460666 0.31342418] - [0.16983042 0.03905478 0.8781425 0.08504421]] -shuffled_X2: [[0.80074457 0.19810149 0.96826158 0.14038694] - [0.87638915 0.69232262 0.89460666 0.31342418] - [0.16983042 0.03905478 0.8781425 0.08504421]] -shuffled_Y1 [[0.95788953 0.42110763 0.53316528 0.09834683]] -shuffled_Y2 [[0.95788953 0.42110763 0.53316528 0.09834683]] - -Here is the C# code (just showing the Xs for the sake of brevity). Note the shuffled_X2 works (as I reported before, but it runs too slowly for large datasets). As you can see, I try various stabs at arriving at shuffled_X1, all failing: - - var m = 4; - var X = np.random.rand(3, m); - var permutation = np.random.permutation(m); - - print($"perm: {permutation}"); - print($"X: {X}"); - - // In Python: shuffled_X1 = X[:, permutation] - try - { - var shuffled_X1 = X[Slice.All, permutation]; - print($"shuffled_X1: {shuffled_X1}"); - } - catch (Exception ex) - { - print($"Param as: raw permutation - error: {ex.Message}"); - } - - try - { - var shuffled_X1 = X[Slice.All, new Slice(permutation)]; - print($"shuffled_X1: {shuffled_X1}"); - } - catch (Exception ex) - { - print($"Param as: new Slice(permutation) - error: {ex.Message}"); - } - - try - { - var shuffled_X1 = X[Slice.All, new NDArray(permutation.ToArray())]; - print($"shuffled_X1: {shuffled_X1}"); - } - catch (Exception ex) - { - print($"Param as: new NDArray(permutation.ToArray()) - error: {ex.Message}"); - } - - try - { - var shuffled_X1 = X[Slice.All, new NDArray(permutation.CloneData())]; - print($"shuffled_X1: {shuffled_X1}"); - } - catch (Exception ex) - { - print($"Param as: new NDArray(permutation.CloneData()) - error: {ex.Message}"); - } - - try - { - var shuffled_X1 = X[Slice.All, new NDArray(Binding.list(permutation.ToArray()))]; - print($"shuffled_X1: {shuffled_X1}"); - } - catch (Exception ex) - { - print($"Param as: new NDArray(Binding.list(permutation.ToArray())) - error: {ex.Message}"); - } - - var shuffled_X2 = new NDArray(np.float32, X.shape); - for (int i=0; i()) - error: shape mismatch: objects cannot be broadcast to a single shape -Param as: new NDArray(permutation.CloneData()) - error: shape mismatch: objects cannot be broadcast to a single shape -Param as: new NDArray(Binding.list(permutation.ToArray())) - error: shape mismatch: objects cannot be broadcast to a single shape -shuffled_X2: [[0.03434474, 0.8834703, 0.5201029, 0.55567724], -[0.6067407, 0.7806033, 0.3361534, 0.7949469], -[0.60182047, 0.11560028, 0.83518714, 0.2805164]] - -Are there any other variations I should try? - - - - -### Comment 21 by @Rikki-Tavi (2020-02-08T04:45:32Z) - -FWIW....It was easy to get working with Numpy.NET: - - [TestMethod] - public void mytest() { - var m = 4; - var X = np.random.rand(3, m); - var permutation = np.random.permutation(m); - - print($"perm: {permutation}"); - print($"X: {X}"); - - var shuffled_X = X[":", permutation]; - print($"shuffled_X: {shuffled_X}"); - } - - private void print (string output) - { - System.Diagnostics.Debug.WriteLine(output); - } - -Resulted in: - -``` -perm: [3 0 1 2] -X: [[0.58033439 0.99341353 0.77685615 0.1893294 ] - [0.81824309 0.7315536 0.64120989 0.97876454] - [0.15659539 0.9045345 0.83839889 0.43254176]] -shuffled_X: [[0.1893294 0.58033439 0.99341353 0.77685615] - [0.97876454 0.81824309 0.7315536 0.64120989] - [0.43254176 0.15659539 0.9045345 0.83839889]] -``` -Now I'm off to investigate if there is an efficient way that I can use Nump.NET NDArrays for my mini-batch randomization in TensorFlow.NET. (I'm admittedly just hacking away here....please stop me, anyone, if you think there is a better way.) - - -### Comment 22 by @henon (2020-02-08T09:41:39Z) - -Obviously, this should also work in NumSharp, but there seems to be a bug somewhere. - -### Comment 23 by @Rikki-Tavi (2020-02-08T11:40:24Z) - -Ok. Thanks. I will keep my eye out for the resolution, once it appears, so that i might switch over. +Now I'm off to investigate if there is an efficient way that I can use Nump.NET NDArrays for my mini-batch randomization in TensorFlow.NET. (I'm admittedly just hacking away here....please stop me, anyone, if you think there is a better way.) + + +### Comment 22 by @henon (2020-02-08T09:41:39Z) + +Obviously, this should also work in NumSharp, but there seems to be a bug somewhere. + +### Comment 23 by @Rikki-Tavi (2020-02-08T11:40:24Z) + +Ok. Thanks. I will keep my eye out for the resolution, once it appears, so that i might switch over. diff --git a/docs/issues/issue-0239-np.linalg.norm.md b/docs/issues/issue-0239-np.linalg.norm.md index 323c6fe8..08835f02 100644 --- a/docs/issues/issue-0239-np.linalg.norm.md +++ b/docs/issues/issue-0239-np.linalg.norm.md @@ -1,49 +1,49 @@ -# #239: np.linalg.norm - -- **URL:** https://github.com/SciSharp/NumSharp/issues/239 -- **State:** OPEN -- **Author:** @henon -- **Created:** 2019-04-05T10:52:03Z -- **Updated:** 2020-10-09T10:41:13Z -- **Labels:** enhancement - -## Description - -I am going to port np.linalg.norm(...) - -## Comments - -### Comment 1 by @Oceania2018 (2019-04-05T15:35:08Z) - -It's not same as ? -![image](https://user-images.githubusercontent.com/1705364/55639218-77e54f00-578e-11e9-8320-89364ddc6805.png) - - -### Comment 2 by @henon (2019-04-05T16:36:31Z) - -ok, you are right. that implements the L2 norm I need. I'll add the shortcut np.linalg.norm(...) just for Python compatibility - -### Comment 3 by @henon (2019-04-05T16:44:54Z) - -no, after checking the code against the numpy docs, actually, the 2-norm is not the same what has been implemented in normalize(). There is no squaring of coefficients. Is that a bug? - -https://het.as.utexas.edu/HET/Software/Numpy/reference/generated/numpy.linalg.norm.html - -### Comment 4 by @Oceania2018 (2019-04-05T18:02:55Z) - -Yes, they're different. - -### Comment 5 by @8 (2020-10-09T07:23:27Z) - -Hi, - -I also noticed that the function is missing in `0.20.5`. -I think one could add a shortcut from `np.linalg.norm(a)` => `np.sqrt(a.dot(a))` instead, which should be equivalent. -Not sure about the overloads though. - -Does this make sense to you? - -Take care, -Martin - - +# #239: np.linalg.norm + +- **URL:** https://github.com/SciSharp/NumSharp/issues/239 +- **State:** OPEN +- **Author:** @henon +- **Created:** 2019-04-05T10:52:03Z +- **Updated:** 2020-10-09T10:41:13Z +- **Labels:** enhancement + +## Description + +I am going to port np.linalg.norm(...) + +## Comments + +### Comment 1 by @Oceania2018 (2019-04-05T15:35:08Z) + +It's not same as ? +![image](https://user-images.githubusercontent.com/1705364/55639218-77e54f00-578e-11e9-8320-89364ddc6805.png) + + +### Comment 2 by @henon (2019-04-05T16:36:31Z) + +ok, you are right. that implements the L2 norm I need. I'll add the shortcut np.linalg.norm(...) just for Python compatibility + +### Comment 3 by @henon (2019-04-05T16:44:54Z) + +no, after checking the code against the numpy docs, actually, the 2-norm is not the same what has been implemented in normalize(). There is no squaring of coefficients. Is that a bug? + +https://het.as.utexas.edu/HET/Software/Numpy/reference/generated/numpy.linalg.norm.html + +### Comment 4 by @Oceania2018 (2019-04-05T18:02:55Z) + +Yes, they're different. + +### Comment 5 by @8 (2020-10-09T07:23:27Z) + +Hi, + +I also noticed that the function is missing in `0.20.5`. +I think one could add a shortcut from `np.linalg.norm(a)` => `np.sqrt(a.dot(a))` instead, which should be equivalent. +Not sure about the overloads though. + +Does this make sense to you? + +Take care, +Martin + + diff --git a/docs/issues/issue-0284-discussion-ground-rules-and-library-structure-architecture.md b/docs/issues/issue-0284-discussion-ground-rules-and-library-structure-architecture.md index e26ed2f5..913aafdb 100644 --- a/docs/issues/issue-0284-discussion-ground-rules-and-library-structure-architecture.md +++ b/docs/issues/issue-0284-discussion-ground-rules-and-library-structure-architecture.md @@ -1,96 +1,96 @@ -# #284: [Discussion] Ground Rules and Library Structure/Architecture +# #284: [Discussion] Ground Rules and Library Structure/Architecture + +- **URL:** https://github.com/SciSharp/NumSharp/issues/284 +- **State:** OPEN +- **Author:** @Nucs +- **Created:** 2019-06-14T15:33:31Z +- **Updated:** 2021-06-29T07:16:05Z +- **Labels:** further discuss + +## Description + +I couldn't but notice the inconsistencies around the library, There are functions that returns copies while some don't while some are not even complete. +The strong-typing of C# does surely makes it harder to get stuff done so `.tt` generators does a nice job helping with that. -- **URL:** https://github.com/SciSharp/NumSharp/issues/284 -- **State:** OPEN -- **Author:** @Nucs -- **Created:** 2019-06-14T15:33:31Z -- **Updated:** 2021-06-29T07:16:05Z -- **Labels:** further discuss +I would like to discuss the following: +1. What are the supported C# primitive types compared to numpy? +Looking at the implicit conversions of `NDArray` and other math operations such as `np.sum`, +I found that the type support is inconsistent. +note: Numpy supports both signed and unsigned types. [see this](https://www.numpy.org/devdocs/user/basics.types.html). -## Description + ![image](https://user-images.githubusercontent.com/649919/59519128-ddad3000-8ecf-11e9-9091-552d86184504.png) -I couldn't but notice the inconsistencies around the library, There are functions that returns copies while some don't while some are not even complete. -The strong-typing of C# does surely makes it harder to get stuff done so `.tt` generators does a nice job helping with that. - -I would like to discuss the following: -1. What are the supported C# primitive types compared to numpy? -Looking at the implicit conversions of `NDArray` and other math operations such as `np.sum`, -I found that the type support is inconsistent. -note: Numpy supports both signed and unsigned types. [see this](https://www.numpy.org/devdocs/user/basics.types.html). - - ![image](https://user-images.githubusercontent.com/649919/59519128-ddad3000-8ecf-11e9-9091-552d86184504.png) - -2. Do we support `Complex`? -because aside of the basic math operations, it is not supported anywhere. - -3. To what rank/ndim the algorithms in C# support? -I saw some functions that support 2-3 and some up to 6. -[Numpy limitation is 32 dimensions.](https://github.com/numpy/numpy/issues/5744) - -4. NDArray mutable vs immutable - I think it should be up to the user to decide via a bool parameter. - * Arithmetic operators should always return a copy - * Following numpy's lead is the priority ofcouse. - -5. Seperation between `np`, `NDArray` and `backend engine` -There is a lot of mixup between whats computed where. -The reality is that they all redirect calls to each other. -In a perfect scenario: -we would refer all operations low-level operations to backend engine to perform the wanted task. -Having a fallback to each method that will compute in C#. -`NDArray` is only responsible for casting, initialization, storing data and serialization -And `np` is the high-level zone that uses backend. - -6. The incomplete methods should be logged somewhere, preferably in Issues or project here. -Heres just a few examples from my findings: - * `np.transpose` supports only to rank 2 and theres a `//todo` in the unit test that fails - * `np.flatten` wasn't implemented completely but was shipped on release - * `np.sum` doesn't support all data types. -We should start by creating issues for those problems in code and we'll get on from there - -7. Means of communication between the developing team via instant messaging? -Edit: Did not see the gitter tag on readme.md - -Those issues are important to address, simply because this library is and will be the backend of many high-level applications. -That's about it, Best regards. +2. Do we support `Complex`? +because aside of the basic math operations, it is not supported anywhere. -## Comments +3. To what rank/ndim the algorithms in C# support? +I saw some functions that support 2-3 and some up to 6. +[Numpy limitation is 32 dimensions.](https://github.com/numpy/numpy/issues/5744) -### Comment 1 by @henon (2019-06-14T17:00:28Z) +4. NDArray mutable vs immutable + I think it should be up to the user to decide via a bool parameter. + * Arithmetic operators should always return a copy + * Following numpy's lead is the priority ofcouse. -Hi Nucs, -you are right, there are many inconsistencies due to the fact that people just added what they needed and left the rest undone. We should define stricter rules and postulate them in the readme. - -I think the most important guidance principle must be compatibility with the original NumPy. Only that way we can guarantee that porting Python scripts using numpy will work in NumSharp also. In this regard there is a lot of work to be done because until now it wasn't enforced very strongly. - -I agree that some kind of management of what we have and what we are missing would be nice. Creating issues is of course a good idea. I have another one: create as many test cases as possible which will reflect what already works and what not. I have recently ported a lot of tests from the Numpy documentation for NumSharp's sister project [Numpy.NET](https://github.com/SciSharp/Numpy.NET) which is a auto-generated wrapper around numpy. While doing that I also generated over 600 test cases which could be repurposed for testing NumSharp. In addition to that, we can generate further test cases that test both Numpy.NET and NumSharp against all the things you mentioned: -* number of supported ranks -* supported data types -* support for all backend engines -etc. - -A complete test suite is the ultimate todo list and helps keeping NumSharp in sync with numpy. - -PS: I could help generating more test cases from the Numpy.NET project. +5. Seperation between `np`, `NDArray` and `backend engine` +There is a lot of mixup between whats computed where. +The reality is that they all redirect calls to each other. +In a perfect scenario: +we would refer all operations low-level operations to backend engine to perform the wanted task. +Having a fallback to each method that will compute in C#. +`NDArray` is only responsible for casting, initialization, storing data and serialization +And `np` is the high-level zone that uses backend. -### Comment 2 by @henon (2019-06-14T17:25:44Z) +6. The incomplete methods should be logged somewhere, preferably in Issues or project here. +Heres just a few examples from my findings: + * `np.transpose` supports only to rank 2 and theres a `//todo` in the unit test that fails + * `np.flatten` wasn't implemented completely but was shipped on release + * `np.sum` doesn't support all data types. +We should start by creating issues for those problems in code and we'll get on from there -ad 7: you can reach us on Gitter for quick questions, small talk, etc, but of course important stuff that should be accessible to all (like this) is of course best discussed in issues. I am sure @Oceania2018 will have answers for the other questions. +7. Means of communication between the developing team via instant messaging? +Edit: Did not see the gitter tag on readme.md -### Comment 3 by @Oceania2018 (2019-06-16T00:02:33Z) +Those issues are important to address, simply because this library is and will be the backend of many high-level applications. +That's about it, Best regards. + +## Comments + +### Comment 1 by @henon (2019-06-14T17:00:28Z) + +Hi Nucs, +you are right, there are many inconsistencies due to the fact that people just added what they needed and left the rest undone. We should define stricter rules and postulate them in the readme. -ad 1: Ideally, support all primitive data type. -ad 2: Not support, but can add easily. -ad 3: In theory, no limitation. -ad 4: Following numpy's lead. -ad 5: Should do the calculation in `engine`, move current code into `engine` gradually. -ad 6: Agree. -ad 7: https://gitter.im/sci-sharp/community +I think the most important guidance principle must be compatibility with the original NumPy. Only that way we can guarantee that porting Python scripts using numpy will work in NumSharp also. In this regard there is a lot of work to be done because until now it wasn't enforced very strongly. -### Comment 4 by @Nucs (2019-08-06T12:47:33Z) +I agree that some kind of management of what we have and what we are missing would be nice. Creating issues is of course a good idea. I have another one: create as many test cases as possible which will reflect what already works and what not. I have recently ported a lot of tests from the Numpy documentation for NumSharp's sister project [Numpy.NET](https://github.com/SciSharp/Numpy.NET) which is a auto-generated wrapper around numpy. While doing that I also generated over 600 test cases which could be repurposed for testing NumSharp. In addition to that, we can generate further test cases that test both Numpy.NET and NumSharp against all the things you mentioned: +* number of supported ranks +* supported data types +* support for all backend engines +etc. -All of these suggestions were implemented in the [new release](https://github.com/SciSharp/NumSharp/pull/336) of NumSharp 0.11.0-alpha2 and available on [nuget](https://www.nuget.org/packages/NumSharp/0.11.0-alpha2). +A complete test suite is the ultimate todo list and helps keeping NumSharp in sync with numpy. -### Comment 5 by @dcuccia (2021-06-29T00:51:14Z) - -ad 2: Would love to have Complex support. Just got to the end of a port and realized this was a non-starter. +PS: I could help generating more test cases from the Numpy.NET project. + +### Comment 2 by @henon (2019-06-14T17:25:44Z) + +ad 7: you can reach us on Gitter for quick questions, small talk, etc, but of course important stuff that should be accessible to all (like this) is of course best discussed in issues. I am sure @Oceania2018 will have answers for the other questions. + +### Comment 3 by @Oceania2018 (2019-06-16T00:02:33Z) + +ad 1: Ideally, support all primitive data type. +ad 2: Not support, but can add easily. +ad 3: In theory, no limitation. +ad 4: Following numpy's lead. +ad 5: Should do the calculation in `engine`, move current code into `engine` gradually. +ad 6: Agree. +ad 7: https://gitter.im/sci-sharp/community + +### Comment 4 by @Nucs (2019-08-06T12:47:33Z) + +All of these suggestions were implemented in the [new release](https://github.com/SciSharp/NumSharp/pull/336) of NumSharp 0.11.0-alpha2 and available on [nuget](https://www.nuget.org/packages/NumSharp/0.11.0-alpha2). + +### Comment 5 by @dcuccia (2021-06-29T00:51:14Z) + +ad 2: Would love to have Complex support. Just got to the end of a port and realized this was a non-starter. diff --git a/docs/issues/issue-0298-implement-numpy.random.choice.md b/docs/issues/issue-0298-implement-numpy.random.choice.md index 04a97bbf..e9791331 100644 --- a/docs/issues/issue-0298-implement-numpy.random.choice.md +++ b/docs/issues/issue-0298-implement-numpy.random.choice.md @@ -1,96 +1,96 @@ -# #298: Implement numpy.random.choice - -- **URL:** https://github.com/SciSharp/NumSharp/issues/298 -- **State:** OPEN -- **Author:** @Plankton555 -- **Created:** 2019-06-27T09:42:50Z -- **Updated:** 2019-10-05T16:12:40Z -- **Labels:** enhancement -- **Assignees:** @Nucs - -## Description - -Generates a random sample from a given (possible weighted) 1-D array. - -NumPy docs: https://docs.scipy.org/doc/numpy/reference/generated/numpy.random.choice.html - -## Comments - -### Comment 1 by @Plankton555 (2019-06-27T09:48:16Z) - -I needed this and implemented a subset of this functionality (random sampling based on weighted probabilities). I can clean up that code and upload here so that it maybe can work as a start for this functionality. - -I've never contributed to an open-source project before though, so I might need some help when it comes to what must be implemented, and where in the architecture it should be located, and so on. - -### Comment 2 by @henon (2019-06-27T10:15:05Z) - -One of us (maybe @Nucs ?) can provide the method stub for you to fill in the code. You can then look at that commit to learn which files needed to be touched to add a new function. - -### Comment 3 by @Plankton555 (2019-06-28T10:11:27Z) - -Please do! Let me know when that is done. - -### Comment 4 by @Nucs (2019-06-30T20:02:39Z) - -Sorry it took so long, it should be placed in `NumSharp.Core/Random/np.random.choice.cs` -```C# -/// -/// //todo -/// -/// If an ndarray, a random sample is generated from its elements. If an int, the random sample is generated as if a were np.arange(a) -/// -/// The probabilities associated with each entry in a. If not given the sample assumes a uniform distribution over all entries in a. -/// https://docs.scipy.org/doc/numpy/reference/generated/numpy.random.choice.html -public NDArray choice(NDArray arr, Shape shape, double[] probabilities = null) { - throw new NotImplementedException(); -} - -/// -/// //todo -/// -/// If an ndarray, a random sample is generated from its elements. If an int, the random sample is generated as if a were np.arange(a) -/// -/// The probabilities associated with each entry in a. If not given the sample assumes a uniform distribution over all entries in a. -/// https://docs.scipy.org/doc/numpy/reference/generated/numpy.random.choice.html -public NDArray choice(int a, Shape shape, double[] probabilities = null) { - throw new NotImplementedException(); -} -``` -Feel free to contact us via [gitter](https://gitter.im/sci-sharp/community) if you get stuck or have a question - -### Comment 5 by @Plankton555 (2019-07-02T14:16:04Z) - -Working on this in https://github.com/Plankton555/NumSharp/tree/feature/np_random_choice - -### Comment 6 by @Plankton555 (2019-07-04T13:52:33Z) - -One of the examples in the numpy docs looks like -``` ->>> aa_milne_arr = ['pooh', 'rabbit', 'piglet', 'Christopher'] ->>> np.random.choice(aa_milne_arr, 5, p=[0.5, 0.1, 0.1, 0.3]) -array(['pooh', 'pooh', 'pooh', 'Christopher', 'piglet'], - dtype='|S11') -``` - -Since the numsharp method signature either takes an integer or an NDArray I tried implementing this string[] list with an NDArray. This gives an exception (which maybe should be reported as a bug or nonimplemented feature since numpy arrays can take strings). -``` -NDArray aa_milne_arr = new string[] { "pooh", "rabbit", "piglet", "Christopher" }; // throws System.NotImplementedException: implicit operator NDArray(Array array) -``` - -In this particular case I can solve it in some ways: -1. Let this error happen until the NDArray has support for strings. -2. Have another method signature which takes an array/enumerable of some sort. This could be reasonable since the numpy docs explicitly states that np.random.choice "Generates a random sample from a given 1-D array", which should be possible to represent as an enumerable? - -Any thoughts? - -### Comment 7 by @Oceania2018 (2019-07-04T13:55:59Z) - -@Nucs Do you have any plan on `String` support? - -### Comment 8 by @Plankton555 (2019-07-04T14:31:40Z) - -Pull request at https://github.com/SciSharp/NumSharp/pull/310 - -### Comment 9 by @Nucs (2019-10-05T16:12:40Z) - -This issue is still open because `np.random.choice` does not support multi-dimensions. +# #298: Implement numpy.random.choice + +- **URL:** https://github.com/SciSharp/NumSharp/issues/298 +- **State:** OPEN +- **Author:** @Plankton555 +- **Created:** 2019-06-27T09:42:50Z +- **Updated:** 2019-10-05T16:12:40Z +- **Labels:** enhancement +- **Assignees:** @Nucs + +## Description + +Generates a random sample from a given (possible weighted) 1-D array. + +NumPy docs: https://docs.scipy.org/doc/numpy/reference/generated/numpy.random.choice.html + +## Comments + +### Comment 1 by @Plankton555 (2019-06-27T09:48:16Z) + +I needed this and implemented a subset of this functionality (random sampling based on weighted probabilities). I can clean up that code and upload here so that it maybe can work as a start for this functionality. + +I've never contributed to an open-source project before though, so I might need some help when it comes to what must be implemented, and where in the architecture it should be located, and so on. + +### Comment 2 by @henon (2019-06-27T10:15:05Z) + +One of us (maybe @Nucs ?) can provide the method stub for you to fill in the code. You can then look at that commit to learn which files needed to be touched to add a new function. + +### Comment 3 by @Plankton555 (2019-06-28T10:11:27Z) + +Please do! Let me know when that is done. + +### Comment 4 by @Nucs (2019-06-30T20:02:39Z) + +Sorry it took so long, it should be placed in `NumSharp.Core/Random/np.random.choice.cs` +```C# +/// +/// //todo +/// +/// If an ndarray, a random sample is generated from its elements. If an int, the random sample is generated as if a were np.arange(a) +/// +/// The probabilities associated with each entry in a. If not given the sample assumes a uniform distribution over all entries in a. +/// https://docs.scipy.org/doc/numpy/reference/generated/numpy.random.choice.html +public NDArray choice(NDArray arr, Shape shape, double[] probabilities = null) { + throw new NotImplementedException(); +} + +/// +/// //todo +/// +/// If an ndarray, a random sample is generated from its elements. If an int, the random sample is generated as if a were np.arange(a) +/// +/// The probabilities associated with each entry in a. If not given the sample assumes a uniform distribution over all entries in a. +/// https://docs.scipy.org/doc/numpy/reference/generated/numpy.random.choice.html +public NDArray choice(int a, Shape shape, double[] probabilities = null) { + throw new NotImplementedException(); +} +``` +Feel free to contact us via [gitter](https://gitter.im/sci-sharp/community) if you get stuck or have a question + +### Comment 5 by @Plankton555 (2019-07-02T14:16:04Z) + +Working on this in https://github.com/Plankton555/NumSharp/tree/feature/np_random_choice + +### Comment 6 by @Plankton555 (2019-07-04T13:52:33Z) + +One of the examples in the numpy docs looks like +``` +>>> aa_milne_arr = ['pooh', 'rabbit', 'piglet', 'Christopher'] +>>> np.random.choice(aa_milne_arr, 5, p=[0.5, 0.1, 0.1, 0.3]) +array(['pooh', 'pooh', 'pooh', 'Christopher', 'piglet'], + dtype='|S11') +``` + +Since the numsharp method signature either takes an integer or an NDArray I tried implementing this string[] list with an NDArray. This gives an exception (which maybe should be reported as a bug or nonimplemented feature since numpy arrays can take strings). +``` +NDArray aa_milne_arr = new string[] { "pooh", "rabbit", "piglet", "Christopher" }; // throws System.NotImplementedException: implicit operator NDArray(Array array) +``` + +In this particular case I can solve it in some ways: +1. Let this error happen until the NDArray has support for strings. +2. Have another method signature which takes an array/enumerable of some sort. This could be reasonable since the numpy docs explicitly states that np.random.choice "Generates a random sample from a given 1-D array", which should be possible to represent as an enumerable? + +Any thoughts? + +### Comment 7 by @Oceania2018 (2019-07-04T13:55:59Z) + +@Nucs Do you have any plan on `String` support? + +### Comment 8 by @Plankton555 (2019-07-04T14:31:40Z) + +Pull request at https://github.com/SciSharp/NumSharp/pull/310 + +### Comment 9 by @Nucs (2019-10-05T16:12:40Z) + +This issue is still open because `np.random.choice` does not support multi-dimensions. diff --git a/docs/issues/issue-0315-tostring-should-truncate-its-output.md b/docs/issues/issue-0315-tostring-should-truncate-its-output.md index c80c199d..a277e026 100644 --- a/docs/issues/issue-0315-tostring-should-truncate-its-output.md +++ b/docs/issues/issue-0315-tostring-should-truncate-its-output.md @@ -1,40 +1,40 @@ -# #315: ToString should truncate its output +# #315: ToString should truncate its output + +- **URL:** https://github.com/SciSharp/NumSharp/issues/315 +- **State:** OPEN +- **Author:** @thomasd3 +- **Created:** 2019-07-18T12:32:09Z +- **Updated:** 2019-07-18T13:56:23Z +- **Labels:** bug, enhancement +- **Assignees:** @Nucs + +## Description + +On very large arrays, NDArray.ToString() is never coming back (or maybe it would at some point in time). + +It would make sense to truncate the ToString() output. + +## Comments + +### Comment 1 by @Nucs (2019-07-18T12:49:04Z) + +I'll add a `DebuggerTypeProxy` that'll truncute beyond certain amount of characters. +After we finish the rework on the NumSharp's backend - It should be much faster. + +### Comment 2 by @henon (2019-07-18T13:30:42Z) + +I implemented the NDArray.ToString() but at the time I didn't know that Numpy has a way of not showing the middle elements of a huge array. if you create a 100x100 matrix it will show this on the console. the ToString method probably should do the same. See below. Also, current ToString() does not format the elements so that they are equally spaced with a monotype font. -- **URL:** https://github.com/SciSharp/NumSharp/issues/315 -- **State:** OPEN -- **Author:** @thomasd3 -- **Created:** 2019-07-18T12:32:09Z -- **Updated:** 2019-07-18T13:56:23Z -- **Labels:** bug, enhancement -- **Assignees:** @Nucs - -## Description - -On very large arrays, NDArray.ToString() is never coming back (or maybe it would at some point in time). - -It would make sense to truncate the ToString() output. - -## Comments - -### Comment 1 by @Nucs (2019-07-18T12:49:04Z) - -I'll add a `DebuggerTypeProxy` that'll truncute beyond certain amount of characters. -After we finish the rework on the NumSharp's backend - It should be much faster. - -### Comment 2 by @henon (2019-07-18T13:30:42Z) - -I implemented the NDArray.ToString() but at the time I didn't know that Numpy has a way of not showing the middle elements of a huge array. if you create a 100x100 matrix it will show this on the console. the ToString method probably should do the same. See below. Also, current ToString() does not format the elements so that they are equally spaced with a monotype font. - -``` ->>> import numpy as np ->>> a=np.arange(10000).reshape(100,100) ->>> a -array([[ 0, 1, 2, ..., 97, 98, 99], - [ 100, 101, 102, ..., 197, 198, 199], - [ 200, 201, 202, ..., 297, 298, 299], - ..., - [9700, 9701, 9702, ..., 9797, 9798, 9799], - [9800, 9801, 9802, ..., 9897, 9898, 9899], - [9900, 9901, 9902, ..., 9997, 9998, 9999]]) ->>> ``` +>>> import numpy as np +>>> a=np.arange(10000).reshape(100,100) +>>> a +array([[ 0, 1, 2, ..., 97, 98, 99], + [ 100, 101, 102, ..., 197, 198, 199], + [ 200, 201, 202, ..., 297, 298, 299], + ..., + [9700, 9701, 9702, ..., 9797, 9798, 9799], + [9800, 9801, 9802, ..., 9897, 9898, 9899], + [9900, 9901, 9902, ..., 9997, 9998, 9999]]) +>>> +``` diff --git a/docs/issues/issue-0326-lazy-loading.md b/docs/issues/issue-0326-lazy-loading.md index 0f398865..e4d4a69f 100644 --- a/docs/issues/issue-0326-lazy-loading.md +++ b/docs/issues/issue-0326-lazy-loading.md @@ -1,122 +1,122 @@ -# #326: Lazy loading - -- **URL:** https://github.com/SciSharp/NumSharp/issues/326 -- **State:** OPEN -- **Author:** @aidevnn -- **Created:** 2019-08-01T13:30:31Z -- **Updated:** 2019-09-25T17:58:40Z -- **Labels:** further discuss -- **Assignees:** @Nucs - -## Description - -Hi -Your lib NumSharp was inspired me and i tried to write a other approach of NumPy more easy to use. -The big idea is the Lazy Loading for the front end and this is my repo. -https://github.com/aidevnn/DesertLand - -My lib isnt optimized for speed at this time, but i can improve it with ease by rewritting NDarray backend class and methods WITHOUT changing nothing from the NDview struct frontend which use the lazy loading. - -Actually your Backend is very very powerfull and maybe the frontend can be also improved with Lazy Loading. - -Best regards. - -## Comments - -### Comment 1 by @Oceania2018 (2019-08-01T13:46:01Z) - -@aidevnn Join us, build Deep Learning library based on current work. - -### Comment 2 by @aidevnn (2019-08-01T13:52:23Z) - -I started to fork your repo, it takes me some month to understand in deep your great work. -Best regards. - -### Comment 3 by @Nucs (2019-08-01T15:01:17Z) - -Hey @aidevnn, Thank you. -A. Are you aware we are rewriting our backend in a [separate branch](https://github.com/SciSharp/NumSharp/tree/unmanaged-bytes-storage)? -B. Can you elaborate more about what do you mean by a front-end lazy loading? -If I understand correctly, lazy-loading is something that numpy does not implement therefore if you wish to contribute a lazy-loading front-end when NumSharp is the backend - it'll have to be in a seperate project. - -### Comment 4 by @aidevnn (2019-08-01T19:23:20Z) - -Hello @Nucs - -A. Ok a devel branch is more collaborative than a fork - -B. Lazy Loading can separate the SharpNum library onto frontend with simple to write specification which will be used by the rest of SciSharp ML/AI framework and the pure SharpNum backend for fast and speed computation. The SciSharp ML/AI team can write their own unit test to integrate SharpNum progression. -Lazy Loading is a design pattern wich allow to build complex expressions and he acts sometime like -proxy-. It is also a possible abstraction for integrating multiple different backend but it isnt a good idea at this moment for the framework SciSharp. - -For example, the expression -NDproxy d = a+2*b+np.log(c); -NDarray e = d; -will only be evaluated during the implicit type conversion. -I am a self taugh and i discovered the lazy loading just now to reduce computation. I have some intuition about some other usage of the Lazy Loading, but i cannot explain it. - -### Comment 5 by @Oceania2018 (2019-08-01T19:35:35Z) - -@aidevnn Is `NDProxy` like a kind of Expression/ Func/ Delegate ? It can be executed after all operations have been decided ? - -### Comment 6 by @aidevnn (2019-08-01T19:56:43Z) - -@Oceania2018 Yes it is a struct that can be defined like this during internal computation of the backend -``` -NDproxy a = new NDproxy(()=>ndArray0) -``` - -Its contains only one field / property : -``` -Func fnc -``` -which can be called explicitly -``` -NDarray b = a.fnc() -``` -during internal computation of the backend -or implicitly during type conversion by the frontend. - -In my repo i used delegate + struct. -https://github.com/aidevnn/DesertLand/blob/master/NDarray/NDview.cs#L4 - -### Comment 7 by @Nucs (2019-08-01T20:04:54Z) - -@aidevnn -A. You can still use that branch from a fork -B. Thanks for laying it out for me, I am too a self taught. -Honestly - there is no fast way to stack lazy loading ops. Any basic implementation in C++ will surpass C#'s performance by far. -Your best luck is to put efforts in [Tensorflow.NET](https://github.com/SciSharp/TensorFlow.NET) since tensorflow holds a somewhat similar API to numpy and is capable of computation on a GPU and it provides a pretty impressive performance (both CPU and GPU). - -if you do insist on writing it on your own then you better get started with IL generation that will link the math ops together. -Mainly because every math-op method you delegate to the next math-op method is adding more overhead than you would think. - -`NumSharp` itself is not the fastest it can be. Any library that utilizes the performance of a low-level languages will be faster than our unmanaged algorithms. - -### Comment 8 by @aidevnn (2019-08-01T20:11:27Z) - -@Nucs you are right! Lazy Loading adds some stacks operations because its a kind of managing expression pattern. -Managing code have advantage for simplifying coding and maintenance, but with loss of speed and performance. Its a tradeoff. - -### Comment 9 by @aidevnn (2019-08-02T19:38:38Z) - -@Nucs The idea behind the lazy loading is to introduce step by step some symbolic neural network algorithms with the numerical algorithms. -For beginning, a precompilation (or may be caching) of all requirement like shape / strides / slices can be done without recreating them each time and its my first objectif. I will let you being informed on my progress - -### Comment 10 by @aidevnn (2019-08-03T02:50:11Z) - -I forget to comment an important thing about some counters. -``` -var a = ND.Uniform(1, 10, 4, 4); // Counters. DataAccess:16 / MethCall:16 -var b = 3 * ND.Sq(a - 1) - 4; // Counters. DataAccess:16 / MethCall:80 -var c = 3 * ND.Sq(a - 1) - 4 * ND.Sqrt(a + 5); // Counters. DataAccess:32 / MethCall:144 -``` -In the above expression, my actual code and symbolic approch reduce rawdata access only to one time for expression b. Also in a more complexe expression, the lazy loading reduce the data access to the minimum effort for expression c. But i am trying to solve some performances problems. - -We can say that a lazy loading pattern can improve the performance in theory but it introduces some other execution stack problems. I will continue to search how to take advantage of it. - -### Comment 11 by @aidevnn (2019-09-25T17:58:40Z) - -I discovered in this article -https://techdecoded.intel.io/resources/parallelism-in-python-directing-vectorization-with-numexpr/#gs.63gvwl - -Numexpr : it is very usefull and it already use lazy-loading and a lot of symbolics optimisations to enhance performance. +# #326: Lazy loading + +- **URL:** https://github.com/SciSharp/NumSharp/issues/326 +- **State:** OPEN +- **Author:** @aidevnn +- **Created:** 2019-08-01T13:30:31Z +- **Updated:** 2019-09-25T17:58:40Z +- **Labels:** further discuss +- **Assignees:** @Nucs + +## Description + +Hi +Your lib NumSharp was inspired me and i tried to write a other approach of NumPy more easy to use. +The big idea is the Lazy Loading for the front end and this is my repo. +https://github.com/aidevnn/DesertLand + +My lib isnt optimized for speed at this time, but i can improve it with ease by rewritting NDarray backend class and methods WITHOUT changing nothing from the NDview struct frontend which use the lazy loading. + +Actually your Backend is very very powerfull and maybe the frontend can be also improved with Lazy Loading. + +Best regards. + +## Comments + +### Comment 1 by @Oceania2018 (2019-08-01T13:46:01Z) + +@aidevnn Join us, build Deep Learning library based on current work. + +### Comment 2 by @aidevnn (2019-08-01T13:52:23Z) + +I started to fork your repo, it takes me some month to understand in deep your great work. +Best regards. + +### Comment 3 by @Nucs (2019-08-01T15:01:17Z) + +Hey @aidevnn, Thank you. +A. Are you aware we are rewriting our backend in a [separate branch](https://github.com/SciSharp/NumSharp/tree/unmanaged-bytes-storage)? +B. Can you elaborate more about what do you mean by a front-end lazy loading? +If I understand correctly, lazy-loading is something that numpy does not implement therefore if you wish to contribute a lazy-loading front-end when NumSharp is the backend - it'll have to be in a seperate project. + +### Comment 4 by @aidevnn (2019-08-01T19:23:20Z) + +Hello @Nucs + +A. Ok a devel branch is more collaborative than a fork + +B. Lazy Loading can separate the SharpNum library onto frontend with simple to write specification which will be used by the rest of SciSharp ML/AI framework and the pure SharpNum backend for fast and speed computation. The SciSharp ML/AI team can write their own unit test to integrate SharpNum progression. +Lazy Loading is a design pattern wich allow to build complex expressions and he acts sometime like -proxy-. It is also a possible abstraction for integrating multiple different backend but it isnt a good idea at this moment for the framework SciSharp. + +For example, the expression +NDproxy d = a+2*b+np.log(c); +NDarray e = d; +will only be evaluated during the implicit type conversion. +I am a self taugh and i discovered the lazy loading just now to reduce computation. I have some intuition about some other usage of the Lazy Loading, but i cannot explain it. + +### Comment 5 by @Oceania2018 (2019-08-01T19:35:35Z) + +@aidevnn Is `NDProxy` like a kind of Expression/ Func/ Delegate ? It can be executed after all operations have been decided ? + +### Comment 6 by @aidevnn (2019-08-01T19:56:43Z) + +@Oceania2018 Yes it is a struct that can be defined like this during internal computation of the backend +``` +NDproxy a = new NDproxy(()=>ndArray0) +``` + +Its contains only one field / property : +``` +Func fnc +``` +which can be called explicitly +``` +NDarray b = a.fnc() +``` +during internal computation of the backend +or implicitly during type conversion by the frontend. + +In my repo i used delegate + struct. +https://github.com/aidevnn/DesertLand/blob/master/NDarray/NDview.cs#L4 + +### Comment 7 by @Nucs (2019-08-01T20:04:54Z) + +@aidevnn +A. You can still use that branch from a fork +B. Thanks for laying it out for me, I am too a self taught. +Honestly - there is no fast way to stack lazy loading ops. Any basic implementation in C++ will surpass C#'s performance by far. +Your best luck is to put efforts in [Tensorflow.NET](https://github.com/SciSharp/TensorFlow.NET) since tensorflow holds a somewhat similar API to numpy and is capable of computation on a GPU and it provides a pretty impressive performance (both CPU and GPU). + +if you do insist on writing it on your own then you better get started with IL generation that will link the math ops together. +Mainly because every math-op method you delegate to the next math-op method is adding more overhead than you would think. + +`NumSharp` itself is not the fastest it can be. Any library that utilizes the performance of a low-level languages will be faster than our unmanaged algorithms. + +### Comment 8 by @aidevnn (2019-08-01T20:11:27Z) + +@Nucs you are right! Lazy Loading adds some stacks operations because its a kind of managing expression pattern. +Managing code have advantage for simplifying coding and maintenance, but with loss of speed and performance. Its a tradeoff. + +### Comment 9 by @aidevnn (2019-08-02T19:38:38Z) + +@Nucs The idea behind the lazy loading is to introduce step by step some symbolic neural network algorithms with the numerical algorithms. +For beginning, a precompilation (or may be caching) of all requirement like shape / strides / slices can be done without recreating them each time and its my first objectif. I will let you being informed on my progress + +### Comment 10 by @aidevnn (2019-08-03T02:50:11Z) + +I forget to comment an important thing about some counters. +``` +var a = ND.Uniform(1, 10, 4, 4); // Counters. DataAccess:16 / MethCall:16 +var b = 3 * ND.Sq(a - 1) - 4; // Counters. DataAccess:16 / MethCall:80 +var c = 3 * ND.Sq(a - 1) - 4 * ND.Sqrt(a + 5); // Counters. DataAccess:32 / MethCall:144 +``` +In the above expression, my actual code and symbolic approch reduce rawdata access only to one time for expression b. Also in a more complexe expression, the lazy loading reduce the data access to the minimum effort for expression c. But i am trying to solve some performances problems. + +We can say that a lazy loading pattern can improve the performance in theory but it introduces some other execution stack problems. I will continue to search how to take advantage of it. + +### Comment 11 by @aidevnn (2019-09-25T17:58:40Z) + +I discovered in this article +https://techdecoded.intel.io/resources/parallelism-in-python-directing-vectorization-with-numexpr/#gs.63gvwl + +Numexpr : it is very usefull and it already use lazy-loading and a lot of symbolics optimisations to enhance performance. diff --git a/docs/issues/issue-0340-memory-limitations.md b/docs/issues/issue-0340-memory-limitations.md index fd433609..7d657599 100644 --- a/docs/issues/issue-0340-memory-limitations.md +++ b/docs/issues/issue-0340-memory-limitations.md @@ -1,31 +1,31 @@ -# #340: Memory Limitations - -- **URL:** https://github.com/SciSharp/NumSharp/issues/340 -- **State:** OPEN -- **Author:** @Nucs -- **Created:** 2019-08-08T15:39:23Z -- **Updated:** 2019-08-12T13:39:23Z -- **Labels:** enhancement -- **Assignees:** @Nucs - -## Description - -Allocation currently supports up to 2^32 bytes due to using int and not IntPtr and long. - -## Comments - -### Comment 1 by @Nucs (2019-08-08T15:52:05Z) - -Unit test -```C# -[TestMethod] -public void MyTestMethod() -{ - NDArray x = np.zeros(new Shape(600, 1000, 1000), np.float32); -} -``` - -### Comment 2 by @Nucs (2019-08-12T13:38:48Z) - -Ported UnmanagedMemoryBlock and ArraySlice to use long in commit https://github.com/SciSharp/NumSharp/commit/539683f23af53a8b1e31023f8472880cbcc69517 . -Next is to port Shape to use long and all the algorithms with it. Mainly refactoring job +# #340: Memory Limitations + +- **URL:** https://github.com/SciSharp/NumSharp/issues/340 +- **State:** OPEN +- **Author:** @Nucs +- **Created:** 2019-08-08T15:39:23Z +- **Updated:** 2019-08-12T13:39:23Z +- **Labels:** enhancement +- **Assignees:** @Nucs + +## Description + +Allocation currently supports up to 2^32 bytes due to using int and not IntPtr and long. + +## Comments + +### Comment 1 by @Nucs (2019-08-08T15:52:05Z) + +Unit test +```C# +[TestMethod] +public void MyTestMethod() +{ + NDArray x = np.zeros(new Shape(600, 1000, 1000), np.float32); +} +``` + +### Comment 2 by @Nucs (2019-08-12T13:38:48Z) + +Ported UnmanagedMemoryBlock and ArraySlice to use long in commit https://github.com/SciSharp/NumSharp/commit/539683f23af53a8b1e31023f8472880cbcc69517 . +Next is to port Shape to use long and all the algorithms with it. Mainly refactoring job diff --git a/docs/issues/issue-0341-ndarray-string-problem.md b/docs/issues/issue-0341-ndarray-string-problem.md index 1b6951bb..62b3b657 100644 --- a/docs/issues/issue-0341-ndarray-string-problem.md +++ b/docs/issues/issue-0341-ndarray-string-problem.md @@ -1,30 +1,30 @@ -# #341: NDArray string problem +# #341: NDArray string problem + +- **URL:** https://github.com/SciSharp/NumSharp/issues/341 +- **State:** OPEN +- **Author:** @lokinfey +- **Created:** 2019-08-26T02:39:33Z +- **Updated:** 2019-08-28T21:45:29Z +- **Labels:** missing feature/s +- **Assignees:** @Nucs + +## Description + +I try to use + var bb8List = new NDArray(typeof(string) , new Shape(bb8Num)); -- **URL:** https://github.com/SciSharp/NumSharp/issues/341 -- **State:** OPEN -- **Author:** @lokinfey -- **Created:** 2019-08-26T02:39:33Z -- **Updated:** 2019-08-28T21:45:29Z -- **Labels:** missing feature/s -- **Assignees:** @Nucs +but it show error like this -## Description - -I try to use - var bb8List = new NDArray(typeof(string) , new Shape(bb8Num)); - -but it show error like this - -Exception has occurred: CLR/System.NotSupportedException -An unhandled exception of type 'System.NotSupportedException' occurred in NumSharp.Core.dll: 'Specified method is not supported.' - at NumSharp.Backends.Unmanaged.ArraySlice.Allocate(Type elementType, Int32 count, Boolean fillDefault) - at NumSharp.Backends.UnmanagedStorage.Allocate(Shape shape, Type dtype, Boolean fillZeros) - at NumSharp.NDArray..ctor(Type dtype, Shape shape) - at TFDemo.Program.Main(String[] args) in /Users/lokinfey/Desktop/File/Proj/AI/tensorflownet/code/TFDemo/Program.cs:line 61 - -## Comments - -### Comment 1 by @Nucs (2019-08-26T13:02:40Z) - -We currently do not support NDArray of string because `System.String` is not an unmanaged object which causes multiple problems with our current backend architecture since strings can have different sizes. -We do plan to implement it ASAP. +Exception has occurred: CLR/System.NotSupportedException +An unhandled exception of type 'System.NotSupportedException' occurred in NumSharp.Core.dll: 'Specified method is not supported.' + at NumSharp.Backends.Unmanaged.ArraySlice.Allocate(Type elementType, Int32 count, Boolean fillDefault) + at NumSharp.Backends.UnmanagedStorage.Allocate(Shape shape, Type dtype, Boolean fillZeros) + at NumSharp.NDArray..ctor(Type dtype, Shape shape) + at TFDemo.Program.Main(String[] args) in /Users/lokinfey/Desktop/File/Proj/AI/tensorflownet/code/TFDemo/Program.cs:line 61 + +## Comments + +### Comment 1 by @Nucs (2019-08-26T13:02:40Z) + +We currently do not support NDArray of string because `System.String` is not an unmanaged object which causes multiple problems with our current backend architecture since strings can have different sizes. +We do plan to implement it ASAP. diff --git a/docs/issues/issue-0343-built-in-system.drawing.image-and-bitmap-methods.md b/docs/issues/issue-0343-built-in-system.drawing.image-and-bitmap-methods.md index 179abfae..89e249ed 100644 --- a/docs/issues/issue-0343-built-in-system.drawing.image-and-bitmap-methods.md +++ b/docs/issues/issue-0343-built-in-system.drawing.image-and-bitmap-methods.md @@ -1,44 +1,44 @@ -# #343: Built-in System.Drawing.Image and Bitmap methods - -- **URL:** https://github.com/SciSharp/NumSharp/issues/343 -- **State:** OPEN -- **Author:** @Nucs -- **Created:** 2019-09-01T13:01:21Z -- **Updated:** 2019-11-05T17:00:36Z -- **Labels:** enhancement -- **Assignees:** @Nucs - -## Description - -Theres a repeating need for methods to load Image to bitmap, we should provide performant builtin API for that. - -EDIT 1: -System.Drawing.Bitmap are now supported by a separate package, [read more](https://github.com/SciSharp/NumSharp/wiki/Bitmap-Extensions). - -## Comments - -### Comment 1 by @Oceania2018 (2019-09-01T13:06:07Z) - -Yes, many people need it. It helps. But that will make NumSharp introduce extra dependency. Or we just add file.read to bytes interface ? - -### Comment 2 by @Nucs (2019-09-01T13:09:39Z) - -Yes, `System.Drawing.Image` package. -I'm thinking about `new NDArray(System.Drawing.Image)` and `np.array(System.Drawing.Image)` or something of that sort. - -### Comment 3 by @sdg002 (2019-09-10T09:02:37Z) - -Thanks for all the hard work. -My 2 cents. It might be worth considering the pros and cons of keeping `System.Drawing.Image` outside of the core `NDArray` through a factory approach. At some later date you might consider introducing a factory class for images loaded using `ImageSharp` or some other imaging library. - -This approach will not cut down your code, however it might spare end developers from having to add too many NUGET references. Gives them the opportunity to progressively encompass more packages as the needs grow. E.g. In my company, `System.Drawing` is not really favored because it does not work on Azure functions due to GDI+ restrictions of Azure function sandbox. - - -### Comment 4 by @Nucs (2019-09-11T20:30:52Z) - -@sdg002 Thanks for the note, -I've decided to create separate projects and nuget packages for `NumSharp.Bitmap` (published) and `NumSharp.ImageSharp` (WIP). - -### Comment 5 by @Oceania2018 (2019-10-04T11:11:03Z) - -Is it possible to integrate OpenCvSharp into NumSharp.ImageSharp? +# #343: Built-in System.Drawing.Image and Bitmap methods + +- **URL:** https://github.com/SciSharp/NumSharp/issues/343 +- **State:** OPEN +- **Author:** @Nucs +- **Created:** 2019-09-01T13:01:21Z +- **Updated:** 2019-11-05T17:00:36Z +- **Labels:** enhancement +- **Assignees:** @Nucs + +## Description + +Theres a repeating need for methods to load Image to bitmap, we should provide performant builtin API for that. + +EDIT 1: +System.Drawing.Bitmap are now supported by a separate package, [read more](https://github.com/SciSharp/NumSharp/wiki/Bitmap-Extensions). + +## Comments + +### Comment 1 by @Oceania2018 (2019-09-01T13:06:07Z) + +Yes, many people need it. It helps. But that will make NumSharp introduce extra dependency. Or we just add file.read to bytes interface ? + +### Comment 2 by @Nucs (2019-09-01T13:09:39Z) + +Yes, `System.Drawing.Image` package. +I'm thinking about `new NDArray(System.Drawing.Image)` and `np.array(System.Drawing.Image)` or something of that sort. + +### Comment 3 by @sdg002 (2019-09-10T09:02:37Z) + +Thanks for all the hard work. +My 2 cents. It might be worth considering the pros and cons of keeping `System.Drawing.Image` outside of the core `NDArray` through a factory approach. At some later date you might consider introducing a factory class for images loaded using `ImageSharp` or some other imaging library. + +This approach will not cut down your code, however it might spare end developers from having to add too many NUGET references. Gives them the opportunity to progressively encompass more packages as the needs grow. E.g. In my company, `System.Drawing` is not really favored because it does not work on Azure functions due to GDI+ restrictions of Azure function sandbox. + + +### Comment 4 by @Nucs (2019-09-11T20:30:52Z) + +@sdg002 Thanks for the note, +I've decided to create separate projects and nuget packages for `NumSharp.Bitmap` (published) and `NumSharp.ImageSharp` (WIP). + +### Comment 5 by @Oceania2018 (2019-10-04T11:11:03Z) + +Is it possible to integrate OpenCvSharp into NumSharp.ImageSharp? diff --git a/docs/issues/issue-0349-scipy.signal.md b/docs/issues/issue-0349-scipy.signal.md index 3ad376ea..e26b69ac 100644 --- a/docs/issues/issue-0349-scipy.signal.md +++ b/docs/issues/issue-0349-scipy.signal.md @@ -1,90 +1,90 @@ -# #349: Scipy.Signal - -- **URL:** https://github.com/SciSharp/NumSharp/issues/349 -- **State:** OPEN -- **Author:** @natank1 -- **Created:** 2019-09-21T07:53:55Z -- **Updated:** 2019-09-22T15:17:25Z -- **Labels:** missing feature/s - -## Description - -Hi - -Is there a way to run spectogram with scipy.signal in Using this library? - -## Comments - -### Comment 1 by @Nucs (2019-09-21T09:38:28Z) - -No, Unfortunately we do not have implementations of [scipy.signal](https://docs.scipy.org/doc/scipy/reference/signal.html). -I would suggest you to use [Numpy.NET](https://github.com/SciSharp/Numpy.NET) as it wraps numpy directly and provides all its features. - -### Comment 2 by @natank1 (2019-09-21T09:48:29Z) - -Including SciPy ? - -### Comment 3 by @Nucs (2019-09-21T10:43:05Z) - -Scipy is the name of the company that developed numpy... -אנחנו תומכים בעיקר באלגברה לינארית שזה בערך השימוש הכי נפוץ בסיפריה והכרחי בכדי להפעיל את הסיפריה טנסורפלוו -הספריה [נמפיינט ](https://github.com/SciSharp/Numpy.NET) תומכת בכל הפיצ'רים של נמפיי - -### Comment 4 by @natank1 (2019-09-21T13:03:15Z) - -Sorry again - -When you say the Scipy exists you mean we have an API for it under -Numpy.Net (I can find such ), -or we can take the python code of scipy and arrange it in away that -Numpy.net will handle this? -Sorry again fro bothering - -On Sat, Sep 21, 2019 at 12:38 PM Eli Belash -wrote: - -> No, Unfortunately we do not have implementations of scipy.signal -> . -> I would suggest you to use Numpy.NET -> as it wraps numpy directly and -> provides all its features. -> +# #349: Scipy.Signal + +- **URL:** https://github.com/SciSharp/NumSharp/issues/349 +- **State:** OPEN +- **Author:** @natank1 +- **Created:** 2019-09-21T07:53:55Z +- **Updated:** 2019-09-22T15:17:25Z +- **Labels:** missing feature/s + +## Description + +Hi + +Is there a way to run spectogram with scipy.signal in Using this library? + +## Comments + +### Comment 1 by @Nucs (2019-09-21T09:38:28Z) + +No, Unfortunately we do not have implementations of [scipy.signal](https://docs.scipy.org/doc/scipy/reference/signal.html). +I would suggest you to use [Numpy.NET](https://github.com/SciSharp/Numpy.NET) as it wraps numpy directly and provides all its features. + +### Comment 2 by @natank1 (2019-09-21T09:48:29Z) + +Including SciPy ? + +### Comment 3 by @Nucs (2019-09-21T10:43:05Z) + +Scipy is the name of the company that developed numpy... +אנחנו תומכים בעיקר באלגברה לינארית שזה בערך השימוש הכי נפוץ בסיפריה והכרחי בכדי להפעיל את הסיפריה טנסורפלוו +הספריה [נמפיינט ](https://github.com/SciSharp/Numpy.NET) תומכת בכל הפיצ'רים של נמפיי + +### Comment 4 by @natank1 (2019-09-21T13:03:15Z) + +Sorry again + +When you say the Scipy exists you mean we have an API for it under +Numpy.Net (I can find such ), +or we can take the python code of scipy and arrange it in away that +Numpy.net will handle this? +Sorry again fro bothering + +On Sat, Sep 21, 2019 at 12:38 PM Eli Belash +wrote: + +> No, Unfortunately we do not have implementations of scipy.signal +> . +> I would suggest you to use Numpy.NET +> as it wraps numpy directly and +> provides all its features. +> +> — +> You are receiving this because you authored the thread. +> Reply to this email directly, view it on GitHub +> , +> or mute the thread +> +> . +> + + +### Comment 5 by @Nucs (2019-09-21T14:06:35Z) + +Scipy is the name of the company that published Numpy. When you say Scipy it makes no sense. +When I comment I add URLs, just click on my mentions in the comments above of numpy.net or scipy.signal. +Numpy.NET is a different library from NumSharp which uses Pythonnet to call numpy. +Numpy.NET implements ALL numpy's functions but might be sometimes slower because you transfer data from C# to python. + +### Comment 6 by @natank1 (2019-09-21T14:36:13Z) + +So function /class that is written in python sipy.signal , how should be called inumpy.net? + +> Scipy is the name of the company that published Numpy. When you say Scipy it makes no sense. +> When I comment I add URLs, just click on my mentions of numpy.net. +> Numpy.NET is a different library from NumSharp which uses Pythonnet to call numpy. +> Numpy.NET implements ALL numpy's functions but might be sometimes slower because you transfer data from C# to python. +> > — > You are receiving this because you authored the thread. -> Reply to this email directly, view it on GitHub -> , -> or mute the thread -> -> . -> - - -### Comment 5 by @Nucs (2019-09-21T14:06:35Z) - -Scipy is the name of the company that published Numpy. When you say Scipy it makes no sense. -When I comment I add URLs, just click on my mentions in the comments above of numpy.net or scipy.signal. -Numpy.NET is a different library from NumSharp which uses Pythonnet to call numpy. -Numpy.NET implements ALL numpy's functions but might be sometimes slower because you transfer data from C# to python. - -### Comment 6 by @natank1 (2019-09-21T14:36:13Z) - -So function /class that is written in python sipy.signal , how should be called inumpy.net? - -> Scipy is the name of the company that published Numpy. When you say Scipy it makes no sense. -> When I comment I add URLs, just click on my mentions of numpy.net. -> Numpy.NET is a different library from NumSharp which uses Pythonnet to call numpy. -> Numpy.NET implements ALL numpy's functions but might be sometimes slower because you transfer data from C# to python. -> -> — -> You are receiving this because you authored the thread. -> Reply to this email directly, view it on GitHub, or mute the thread. - - -### Comment 7 by @Nucs (2019-09-21T15:57:10Z) - -I have no clue, This is NumSharp repository. -Read Numpy.NET's readme.md. - -### Comment 8 by @natank1 (2019-09-21T16:06:56Z) - -Thanks! +> Reply to this email directly, view it on GitHub, or mute the thread. + + +### Comment 7 by @Nucs (2019-09-21T15:57:10Z) + +I have no clue, This is NumSharp repository. +Read Numpy.NET's readme.md. + +### Comment 8 by @natank1 (2019-09-21T16:06:56Z) + +Thanks! diff --git a/docs/issues/issue-0351-proper-way-to-iterate-using-ienumerable-t.md b/docs/issues/issue-0351-proper-way-to-iterate-using-ienumerable-t.md index b9f655cd..bea56a0b 100644 --- a/docs/issues/issue-0351-proper-way-to-iterate-using-ienumerable-t.md +++ b/docs/issues/issue-0351-proper-way-to-iterate-using-ienumerable-t.md @@ -1,15 +1,15 @@ -# #351: Proper way to iterate using IEnumerable - -- **URL:** https://github.com/SciSharp/NumSharp/issues/351 -- **State:** OPEN -- **Author:** @Nucs -- **Created:** 2019-09-28T15:42:47Z -- **Updated:** 2019-09-28T15:42:47Z -- **Labels:** enhancement -- **Assignees:** @Nucs - -## Description - -There should be an approachable way to perform fast `foreach` on a `NDArray`. -Currently `NDArray` implements non-generic `IEnumerable` which returns a boxed value that can be either the `NDArray.dtype` or an `NDArray`. -Boxing causes `O(n)` operations to be significantly slower on large datasets. +# #351: Proper way to iterate using IEnumerable + +- **URL:** https://github.com/SciSharp/NumSharp/issues/351 +- **State:** OPEN +- **Author:** @Nucs +- **Created:** 2019-09-28T15:42:47Z +- **Updated:** 2019-09-28T15:42:47Z +- **Labels:** enhancement +- **Assignees:** @Nucs + +## Description + +There should be an approachable way to perform fast `foreach` on a `NDArray`. +Currently `NDArray` implements non-generic `IEnumerable` which returns a boxed value that can be either the `NDArray.dtype` or an `NDArray`. +Boxing causes `O(n)` operations to be significantly slower on large datasets. diff --git a/docs/issues/issue-0360-np.any.md b/docs/issues/issue-0360-np.any.md index 5499f7e2..5adf9c74 100644 --- a/docs/issues/issue-0360-np.any.md +++ b/docs/issues/issue-0360-np.any.md @@ -1,21 +1,21 @@ -# #360: np.any - -- **URL:** https://github.com/SciSharp/NumSharp/issues/360 -- **State:** OPEN -- **Author:** @Oceania2018 -- **Created:** 2019-10-05T23:50:58Z -- **Updated:** 2019-10-12T11:16:22Z -- **Labels:** enhancement -- **Assignees:** @Nucs - -## Description - -Test whether any array element along a given axis evaluates to True. -https://docs.scipy.org/doc/numpy/reference/generated/numpy.any.html - -## Comments - -### Comment 1 by @Nucs (2019-10-12T11:16:22Z) - -Added in https://github.com/SciSharp/NumSharp/commit/f4ee1353e1d159a9e9334dcb38ee4f005160808c , -Remaining open because specific axis support is not implemented yet. +# #360: np.any + +- **URL:** https://github.com/SciSharp/NumSharp/issues/360 +- **State:** OPEN +- **Author:** @Oceania2018 +- **Created:** 2019-10-05T23:50:58Z +- **Updated:** 2019-10-12T11:16:22Z +- **Labels:** enhancement +- **Assignees:** @Nucs + +## Description + +Test whether any array element along a given axis evaluates to True. +https://docs.scipy.org/doc/numpy/reference/generated/numpy.any.html + +## Comments + +### Comment 1 by @Nucs (2019-10-12T11:16:22Z) + +Added in https://github.com/SciSharp/NumSharp/commit/f4ee1353e1d159a9e9334dcb38ee4f005160808c , +Remaining open because specific axis support is not implemented yet. diff --git a/docs/issues/issue-0361-mixing-indices-and-slices-in-ndarray.md b/docs/issues/issue-0361-mixing-indices-and-slices-in-ndarray.md index da00e0aa..64547e8c 100644 --- a/docs/issues/issue-0361-mixing-indices-and-slices-in-ndarray.md +++ b/docs/issues/issue-0361-mixing-indices-and-slices-in-ndarray.md @@ -1,101 +1,101 @@ -# #361: Mixing indices and slices in NDArray[...] - -- **URL:** https://github.com/SciSharp/NumSharp/issues/361 -- **State:** OPEN -- **Author:** @Oceania2018 -- **Created:** 2019-10-06T03:22:07Z -- **Updated:** 2019-10-12T11:35:37Z -- **Labels:** enhancement -- **Assignees:** @henon, @Nucs - -## Description - -Is it possible to suppor mixed index/ slice? This is what numpy doing: - -![image](https://user-images.githubusercontent.com/1705364/66263777-49d4dc00-e7be-11e9-8fba-fd1014cbd922.png) - -Currently, it doesn't support: - -![image](https://user-images.githubusercontent.com/1705364/66263800-7688f380-e7be-11e9-933a-2dfeb71f98f3.png) - - -## Comments - -### Comment 1 by @Nucs (2019-10-06T06:31:04Z) - -```C# -label[i][Slice.Index(yind), Slice.Index(xind), Slice.Index(iou_mast), new Slice(0, 4)] = bbox_xywh; +# #361: Mixing indices and slices in NDArray[...] + +- **URL:** https://github.com/SciSharp/NumSharp/issues/361 +- **State:** OPEN +- **Author:** @Oceania2018 +- **Created:** 2019-10-06T03:22:07Z +- **Updated:** 2019-10-12T11:35:37Z +- **Labels:** enhancement +- **Assignees:** @henon, @Nucs + +## Description + +Is it possible to suppor mixed index/ slice? This is what numpy doing: + +![image](https://user-images.githubusercontent.com/1705364/66263777-49d4dc00-e7be-11e9-8fba-fd1014cbd922.png) + +Currently, it doesn't support: + +![image](https://user-images.githubusercontent.com/1705364/66263800-7688f380-e7be-11e9-933a-2dfeb71f98f3.png) + + +## Comments + +### Comment 1 by @Nucs (2019-10-06T06:31:04Z) + +```C# +label[i][Slice.Index(yind), Slice.Index(xind), Slice.Index(iou_mast), new Slice(0, 4)] = bbox_xywh; +``` + +### Comment 2 by @henon (2019-10-06T11:48:20Z) + +or + +```C# +label[i][$"{yind}, {xind}, {iou_mast}, 0:4"] = bbox_xywh; ``` -### Comment 2 by @henon (2019-10-06T11:48:20Z) - -or - -```C# -label[i][$"{yind}, {xind}, {iou_mast}, 0:4"] = bbox_xywh; -``` - -Btw: we could try implicitly convert from int to Slice.Index(int) - - -### Comment 3 by @Nucs (2019-10-06T12:30:22Z) - -Worth mentioning that using a string inside a loop or O(n) will affect performance. -Regex parsing is not lightning fast. - -### Comment 4 by @Oceania2018 (2019-10-06T13:51:40Z) - -The `iou_mask` is `NDArray`. -![image](https://user-images.githubusercontent.com/1705364/66269842-048ec980-e813-11e9-8e33-fa624271ace2.png) - -It means we use different ways in different dimension to select elements. - -One approach my idea is: -Define a `IIndex` interface, `NDArray` and `Slice` implement `IIndex`. -update -```csharp -NDArray this[params IIndex[] selectors] -{ - get; set; -} -``` - - -### Comment 5 by @Nucs (2019-10-06T14:40:04Z) - -Too messy, plus it won't solve your problem.. you can't implement implicit cast from `int` to `IIndex`. -Having index `nd[int, int, NDArray, Slice]` doesn't make sense. Our algorithm accepts either only slices or only ints. -`nd[NDArray[]]` is not for Indexing, it is for Masking. -Right now use `Slice.Index`, in the future I'll implement implicit castings to `Slice`. - -### Comment 6 by @henon (2019-10-06T15:04:49Z) - -We might have to extend the slicing algorithm to accept a mask (i.e. Slice.Mask(boolean_array)). He is porting Python code so it seems Python allows mixing of indices and masks. - -### Comment 7 by @Nucs (2019-10-06T15:06:57Z) - -Masking has a complete separate algorithm from slicing. In fact they don't have anything in common (function-wise). - -### Comment 8 by @Oceania2018 (2019-10-06T16:36:44Z) - -Not only for masking, but also for any 1d array. We don’t have to have int to IIndex implicitly, we can use np.array(1) as alternative. - -The goal is having people can use 1d or Slice, Scalar to select and mask elements in appropriate dimensions. - -### Comment 9 by @Oceania2018 (2019-10-12T00:13:21Z) - -@henon This situation doesn't work: - -`iou_mask` is `NDArray`, `yind` and `xind` are `int`: -![image](https://user-images.githubusercontent.com/1705364/66691314-0addd500-ec5b-11e9-816f-be0dd63f9d0a.png) - -![image](https://user-images.githubusercontent.com/1705364/66691447-0fef5400-ec5c-11e9-8368-d9f01b5ea440.png) - - -### Comment 10 by @henon (2019-10-12T08:32:57Z) - -I know, @Nucs is removing the int[] indexer in favor of an object[] indexer so that implicit conversion operators don't get in the way and we can reliably forward the different use cases into the right implementatons ( slicing if no NDarrays are part of the params and index extraction/masking otherwise) - -### Comment 11 by @Nucs (2019-10-12T11:35:37Z) - -@Oceania2018 Please verify if it works on master branch. +Btw: we could try implicitly convert from int to Slice.Index(int) + + +### Comment 3 by @Nucs (2019-10-06T12:30:22Z) + +Worth mentioning that using a string inside a loop or O(n) will affect performance. +Regex parsing is not lightning fast. + +### Comment 4 by @Oceania2018 (2019-10-06T13:51:40Z) + +The `iou_mask` is `NDArray`. +![image](https://user-images.githubusercontent.com/1705364/66269842-048ec980-e813-11e9-8e33-fa624271ace2.png) + +It means we use different ways in different dimension to select elements. + +One approach my idea is: +Define a `IIndex` interface, `NDArray` and `Slice` implement `IIndex`. +update +```csharp +NDArray this[params IIndex[] selectors] +{ + get; set; +} +``` + + +### Comment 5 by @Nucs (2019-10-06T14:40:04Z) + +Too messy, plus it won't solve your problem.. you can't implement implicit cast from `int` to `IIndex`. +Having index `nd[int, int, NDArray, Slice]` doesn't make sense. Our algorithm accepts either only slices or only ints. +`nd[NDArray[]]` is not for Indexing, it is for Masking. +Right now use `Slice.Index`, in the future I'll implement implicit castings to `Slice`. + +### Comment 6 by @henon (2019-10-06T15:04:49Z) + +We might have to extend the slicing algorithm to accept a mask (i.e. Slice.Mask(boolean_array)). He is porting Python code so it seems Python allows mixing of indices and masks. + +### Comment 7 by @Nucs (2019-10-06T15:06:57Z) + +Masking has a complete separate algorithm from slicing. In fact they don't have anything in common (function-wise). + +### Comment 8 by @Oceania2018 (2019-10-06T16:36:44Z) + +Not only for masking, but also for any 1d array. We don’t have to have int to IIndex implicitly, we can use np.array(1) as alternative. + +The goal is having people can use 1d or Slice, Scalar to select and mask elements in appropriate dimensions. + +### Comment 9 by @Oceania2018 (2019-10-12T00:13:21Z) + +@henon This situation doesn't work: + +`iou_mask` is `NDArray`, `yind` and `xind` are `int`: +![image](https://user-images.githubusercontent.com/1705364/66691314-0addd500-ec5b-11e9-816f-be0dd63f9d0a.png) + +![image](https://user-images.githubusercontent.com/1705364/66691447-0fef5400-ec5c-11e9-8368-d9f01b5ea440.png) + + +### Comment 10 by @henon (2019-10-12T08:32:57Z) + +I know, @Nucs is removing the int[] indexer in favor of an object[] indexer so that implicit conversion operators don't get in the way and we can reliably forward the different use cases into the right implementatons ( slicing if no NDarrays are part of the params and index extraction/masking otherwise) + +### Comment 11 by @Nucs (2019-10-12T11:35:37Z) + +@Oceania2018 Please verify if it works on master branch. diff --git a/docs/issues/issue-0362-implicit-operators-for.md b/docs/issues/issue-0362-implicit-operators-for.md index 093c12fa..ff44fb18 100644 --- a/docs/issues/issue-0362-implicit-operators-for.md +++ b/docs/issues/issue-0362-implicit-operators-for.md @@ -1,43 +1,43 @@ -# #362: Implicit operators for >, >=, <, <= - -- **URL:** https://github.com/SciSharp/NumSharp/issues/362 -- **State:** OPEN -- **Author:** @deepakkumar1984 -- **Created:** 2019-10-06T07:49:57Z -- **Updated:** 2019-10-12T00:33:30Z -- **Labels:** help wanted, missing feature/s - -## Description - -x == 1 gives a result which is NDArray as expected - -x>1 and other operators like >=, <, <= give null result - -## Comments - -### Comment 1 by @Nucs (2019-10-06T07:51:06Z) - -`np.where` is yet to be implemented. - -### Comment 2 by @deepakkumar1984 (2019-10-06T08:55:19Z) - -I have done some work with np.where in this commit https://github.com/deepakkumar1984/NumSharp/commit/8bfa4f2484fc974e10e250f6b7ef5da0f381b683 -the first parameter is a condition for which we need to finish the implementation under https://github.com/SciSharp/NumSharp/tree/master/src/NumSharp.Core/Operations/Elementwise - -Most of the code in commented and return as null - -### Comment 3 by @Nucs (2019-10-06T09:03:06Z) - -I misunderstood [np.where](https://docs.scipy.org/doc/numpy/reference/generated/numpy.where.html), I was sure that the first argument is something of a sort of Expression>. -I'll need to implement each (comparing) operator separately and np.where will work then. -I'll open up a separate issue for that. This might take a while as I'm unavailable (sunday is not a day off in my country 😅) - -### Comment 4 by @Oceania2018 (2019-10-12T00:03:42Z) - -Same thing happened for me, shouldn't return null: -![image](https://user-images.githubusercontent.com/1705364/66691132-c6056e80-ec59-11e9-890e-29e516a00a1f.png) - - -### Comment 5 by @Nucs (2019-10-12T00:33:30Z) - -Null because it is not implemented. +# #362: Implicit operators for >, >=, <, <= + +- **URL:** https://github.com/SciSharp/NumSharp/issues/362 +- **State:** OPEN +- **Author:** @deepakkumar1984 +- **Created:** 2019-10-06T07:49:57Z +- **Updated:** 2019-10-12T00:33:30Z +- **Labels:** help wanted, missing feature/s + +## Description + +x == 1 gives a result which is NDArray as expected + +x>1 and other operators like >=, <, <= give null result + +## Comments + +### Comment 1 by @Nucs (2019-10-06T07:51:06Z) + +`np.where` is yet to be implemented. + +### Comment 2 by @deepakkumar1984 (2019-10-06T08:55:19Z) + +I have done some work with np.where in this commit https://github.com/deepakkumar1984/NumSharp/commit/8bfa4f2484fc974e10e250f6b7ef5da0f381b683 +the first parameter is a condition for which we need to finish the implementation under https://github.com/SciSharp/NumSharp/tree/master/src/NumSharp.Core/Operations/Elementwise + +Most of the code in commented and return as null + +### Comment 3 by @Nucs (2019-10-06T09:03:06Z) + +I misunderstood [np.where](https://docs.scipy.org/doc/numpy/reference/generated/numpy.where.html), I was sure that the first argument is something of a sort of Expression>. +I'll need to implement each (comparing) operator separately and np.where will work then. +I'll open up a separate issue for that. This might take a while as I'm unavailable (sunday is not a day off in my country 😅) + +### Comment 4 by @Oceania2018 (2019-10-12T00:03:42Z) + +Same thing happened for me, shouldn't return null: +![image](https://user-images.githubusercontent.com/1705364/66691132-c6056e80-ec59-11e9-890e-29e516a00a1f.png) + + +### Comment 5 by @Nucs (2019-10-12T00:33:30Z) + +Null because it is not implemented. diff --git a/docs/issues/issue-0363-add-nditerator-t-overload-with-support-for-specific-axis.md b/docs/issues/issue-0363-add-nditerator-t-overload-with-support-for-specific-axis.md index bb99dbd8..775be7f3 100644 --- a/docs/issues/issue-0363-add-nditerator-t-overload-with-support-for-specific-axis.md +++ b/docs/issues/issue-0363-add-nditerator-t-overload-with-support-for-specific-axis.md @@ -1,18 +1,18 @@ -# #363: Add `NDIterator` overload with support for specific axis. +# #363: Add `NDIterator` overload with support for specific axis. + +- **URL:** https://github.com/SciSharp/NumSharp/issues/363 +- **State:** OPEN +- **Author:** @Nucs +- **Created:** 2019-10-12T11:11:32Z +- **Updated:** 2019-10-12T11:11:32Z +- **Labels:** missing feature/s + +## Description + +NDIterator is useful, we should add an overload that handles specific axis iterator: +usage: +```C# +new NDIterator(ndarray, axis: 1); +``` -- **URL:** https://github.com/SciSharp/NumSharp/issues/363 -- **State:** OPEN -- **Author:** @Nucs -- **Created:** 2019-10-12T11:11:32Z -- **Updated:** 2019-10-12T11:11:32Z -- **Labels:** missing feature/s - -## Description - -NDIterator is useful, we should add an overload that handles specific axis iterator: -usage: -```C# -new NDIterator(ndarray, axis: 1); -``` - -Also add an overload to extension `ndarray.AsIterator(axis: 1);` +Also add an overload to extension `ndarray.AsIterator(axis: 1);` diff --git a/docs/issues/issue-0365-np.nonzero.md b/docs/issues/issue-0365-np.nonzero.md index c34d85e9..76a5d2b6 100644 --- a/docs/issues/issue-0365-np.nonzero.md +++ b/docs/issues/issue-0365-np.nonzero.md @@ -1,14 +1,14 @@ -# #365: np.nonzero - -- **URL:** https://github.com/SciSharp/NumSharp/issues/365 -- **State:** OPEN -- **Author:** @Oceania2018 -- **Created:** 2019-10-12T19:49:12Z -- **Updated:** 2019-10-12T19:49:12Z -- **Labels:** enhancement -- **Assignees:** @Nucs - -## Description - -Return the indices of the elements that are non-zero. -https://docs.scipy.org/doc/numpy/reference/generated/numpy.nonzero.html +# #365: np.nonzero + +- **URL:** https://github.com/SciSharp/NumSharp/issues/365 +- **State:** OPEN +- **Author:** @Oceania2018 +- **Created:** 2019-10-12T19:49:12Z +- **Updated:** 2019-10-12T19:49:12Z +- **Labels:** enhancement +- **Assignees:** @Nucs + +## Description + +Return the indices of the elements that are non-zero. +https://docs.scipy.org/doc/numpy/reference/generated/numpy.nonzero.html diff --git a/docs/issues/issue-0366-masking-ndarray-nd.md b/docs/issues/issue-0366-masking-ndarray-nd.md index 9da897ab..2004194b 100644 --- a/docs/issues/issue-0366-masking-ndarray-nd.md +++ b/docs/issues/issue-0366-masking-ndarray-nd.md @@ -1,26 +1,26 @@ -# #366: Masking (ndarray[nd]) +# #366: Masking (ndarray[nd]) + +- **URL:** https://github.com/SciSharp/NumSharp/issues/366 +- **State:** OPEN +- **Author:** @henon +- **Created:** 2019-10-12T19:49:33Z +- **Updated:** 2019-10-12T19:51:59Z + +## Description + +Doesn't work in ndarray[nd]? -- **URL:** https://github.com/SciSharp/NumSharp/issues/366 -- **State:** OPEN -- **Author:** @henon -- **Created:** 2019-10-12T19:49:33Z -- **Updated:** 2019-10-12T19:51:59Z +![image](https://user-images.githubusercontent.com/1705364/66706800-4335ef80-ecfd-11e9-9a4d-4631255241d8.png) -## Description +```shell +System.NotSupportedException: Specified method is not supported. + at NumSharp.NDArray.set_Item(Object[] indices_or_slices, NDArray value) in D:\SciSharp\NumSharp\src\NumSharp.Core\Selection\NDArray.Indexing.cs:line 202 +``` -Doesn't work in ndarray[nd]? - -![image](https://user-images.githubusercontent.com/1705364/66706800-4335ef80-ecfd-11e9-9a4d-4631255241d8.png) - -```shell -System.NotSupportedException: Specified method is not supported. - at NumSharp.NDArray.set_Item(Object[] indices_or_slices, NDArray value) in D:\SciSharp\NumSharp\src\NumSharp.Core\Selection\NDArray.Indexing.cs:line 202 -``` - -_Originally posted by @Oceania2018 in https://github.com/SciSharp/NumSharp/issues/359#issuecomment-541355337_ - -## Comments - -### Comment 1 by @henon (2019-10-12T19:51:59Z) - -we need this for it: #365 +_Originally posted by @Oceania2018 in https://github.com/SciSharp/NumSharp/issues/359#issuecomment-541355337_ + +## Comments + +### Comment 1 by @henon (2019-10-12T19:51:59Z) + +we need this for it: #365 diff --git a/docs/issues/issue-0368-masking-a-slice-...-returns-null.md b/docs/issues/issue-0368-masking-a-slice-...-returns-null.md index da40d4e5..eec5f071 100644 --- a/docs/issues/issue-0368-masking-a-slice-...-returns-null.md +++ b/docs/issues/issue-0368-masking-a-slice-...-returns-null.md @@ -1,45 +1,45 @@ -# #368: Masking a slice ("...") returns null - -- **URL:** https://github.com/SciSharp/NumSharp/issues/368 -- **State:** OPEN -- **Author:** @ohjerm -- **Created:** 2019-11-12T09:48:54Z -- **Updated:** 2019-11-12T14:56:29Z -- **Assignees:** @henon, @Nucs - -## Description - -``` -NDArray positive_boxes = batch_item["...,0"] != 0; -Debug.Log(positive_boxes); -``` -The output is Null. In numpy I would expect an boolean mask NDArray of shape (...,1) here, right? Is masking implemented another way? - -I'm on the latest nuget release (0.20.4) if that helps. - -## Comments - -### Comment 1 by @henon (2019-11-12T14:16:57Z) - -@ChaiKnight: I can not work with the example you have given here to reproduce the problem. Can you please write me a piece of code that is complete and reproduces the bug? - -Like this: - -```C# -var x=np.arange(10).reshape(2,5); -var y=x["...,0"]; -// what does it give and what do you expect instead? -``` -I don't know your setup, the above is just an example. Thanks. - -### Comment 2 by @ohjerm (2019-11-12T14:42:55Z) - -I don't know how much more I can give you without just dumping my entire codebase on you. My batch_item is an NDArray of size (7160,6). When I test I currently just feed it zeroes, so it basically looks like np.zero((7160,6)) to me when I print it. - -Your example seems to work just fine, I am able to print out [0,5], but I am also able to print out a long array of zeroes when I do `Debug.Log(batch_item["...,0"]);`, so somewhere in the masking process is where it goes wrong. I figured the masking should return an empty array like numpy does, of size (0,6). Is that at all possible? - - - -### Comment 3 by @henon (2019-11-12T14:55:51Z) - -Alright, I understand. This is a known problem then. Masking is currently under construction. @Nucs is working on it. +# #368: Masking a slice ("...") returns null + +- **URL:** https://github.com/SciSharp/NumSharp/issues/368 +- **State:** OPEN +- **Author:** @ohjerm +- **Created:** 2019-11-12T09:48:54Z +- **Updated:** 2019-11-12T14:56:29Z +- **Assignees:** @henon, @Nucs + +## Description + +``` +NDArray positive_boxes = batch_item["...,0"] != 0; +Debug.Log(positive_boxes); +``` +The output is Null. In numpy I would expect an boolean mask NDArray of shape (...,1) here, right? Is masking implemented another way? + +I'm on the latest nuget release (0.20.4) if that helps. + +## Comments + +### Comment 1 by @henon (2019-11-12T14:16:57Z) + +@ChaiKnight: I can not work with the example you have given here to reproduce the problem. Can you please write me a piece of code that is complete and reproduces the bug? + +Like this: + +```C# +var x=np.arange(10).reshape(2,5); +var y=x["...,0"]; +// what does it give and what do you expect instead? +``` +I don't know your setup, the above is just an example. Thanks. + +### Comment 2 by @ohjerm (2019-11-12T14:42:55Z) + +I don't know how much more I can give you without just dumping my entire codebase on you. My batch_item is an NDArray of size (7160,6). When I test I currently just feed it zeroes, so it basically looks like np.zero((7160,6)) to me when I print it. + +Your example seems to work just fine, I am able to print out [0,5], but I am also able to print out a long array of zeroes when I do `Debug.Log(batch_item["...,0"]);`, so somewhere in the masking process is where it goes wrong. I figured the masking should return an empty array like numpy does, of size (0,6). Is that at all possible? + + + +### Comment 3 by @henon (2019-11-12T14:55:51Z) + +Alright, I understand. This is a known problem then. Masking is currently under construction. @Nucs is working on it. diff --git a/docs/issues/issue-0369-slicing-notsupportedexception.md b/docs/issues/issue-0369-slicing-notsupportedexception.md index 6e7c1a1f..5e7293a0 100644 --- a/docs/issues/issue-0369-slicing-notsupportedexception.md +++ b/docs/issues/issue-0369-slicing-notsupportedexception.md @@ -1,15 +1,15 @@ -# #369: Slicing NotSupportedException - -- **URL:** https://github.com/SciSharp/NumSharp/issues/369 -- **State:** OPEN -- **Author:** @Oceania2018 -- **Created:** 2019-11-23T18:48:33Z -- **Updated:** 2019-11-23T18:48:33Z -- **Labels:** missing feature/s -- **Assignees:** @Nucs - -## Description - -Runing YOLO with `ndarray-indexing` branch. -![image](https://user-images.githubusercontent.com/1705364/69483632-54d7e000-0def-11ea-99b4-3b2863490b39.png) - +# #369: Slicing NotSupportedException + +- **URL:** https://github.com/SciSharp/NumSharp/issues/369 +- **State:** OPEN +- **Author:** @Oceania2018 +- **Created:** 2019-11-23T18:48:33Z +- **Updated:** 2019-11-23T18:48:33Z +- **Labels:** missing feature/s +- **Assignees:** @Nucs + +## Description + +Runing YOLO with `ndarray-indexing` branch. +![image](https://user-images.githubusercontent.com/1705364/69483632-54d7e000-0def-11ea-99b4-3b2863490b39.png) + diff --git a/docs/issues/issue-0372-clustering-example.md b/docs/issues/issue-0372-clustering-example.md index 3ff0dc3c..aeab7ae5 100644 --- a/docs/issues/issue-0372-clustering-example.md +++ b/docs/issues/issue-0372-clustering-example.md @@ -1,24 +1,24 @@ -# #372: Clustering Example - -- **URL:** https://github.com/SciSharp/NumSharp/issues/372 -- **State:** OPEN -- **Author:** @turowicz -- **Created:** 2019-12-05T13:32:43Z -- **Updated:** 2019-12-07T17:51:04Z -- **Labels:** help wanted, missing feature/s - -## Description - -Do we have a C# version of something like this? -https://github.com/lars76/kmeans-anchor-boxes - - -## Comments - -### Comment 1 by @turowicz (2019-12-05T13:48:45Z) - -cc @Nucs @Oceania2018 - -### Comment 2 by @turowicz (2019-12-05T14:13:32Z) - -It seems that C# `np.random.choice` has different arguments than the original one. +# #372: Clustering Example + +- **URL:** https://github.com/SciSharp/NumSharp/issues/372 +- **State:** OPEN +- **Author:** @turowicz +- **Created:** 2019-12-05T13:32:43Z +- **Updated:** 2019-12-07T17:51:04Z +- **Labels:** help wanted, missing feature/s + +## Description + +Do we have a C# version of something like this? +https://github.com/lars76/kmeans-anchor-boxes + + +## Comments + +### Comment 1 by @turowicz (2019-12-05T13:48:45Z) + +cc @Nucs @Oceania2018 + +### Comment 2 by @turowicz (2019-12-05T14:13:32Z) + +It seems that C# `np.random.choice` has different arguments than the original one. diff --git a/docs/issues/issue-0374-np.append.md b/docs/issues/issue-0374-np.append.md index f7aa8f78..7f3e7343 100644 --- a/docs/issues/issue-0374-np.append.md +++ b/docs/issues/issue-0374-np.append.md @@ -1,19 +1,19 @@ -# #374: np.append - -- **URL:** https://github.com/SciSharp/NumSharp/issues/374 -- **State:** OPEN -- **Author:** @solarflarefx -- **Created:** 2019-12-05T20:29:23Z -- **Updated:** 2019-12-07T17:49:30Z -- **Labels:** help wanted, missing feature/s - -## Description - -Is there an equivalent method to np.append? If not, what is the best workaround? - -## Comments - -### Comment 1 by @Nucs (2019-12-07T17:49:22Z) - -Maybe np.concatenate, np.vstack or np.stack will help you. They might require reshaping to emulate np.append. - +# #374: np.append + +- **URL:** https://github.com/SciSharp/NumSharp/issues/374 +- **State:** OPEN +- **Author:** @solarflarefx +- **Created:** 2019-12-05T20:29:23Z +- **Updated:** 2019-12-07T17:49:30Z +- **Labels:** help wanted, missing feature/s + +## Description + +Is there an equivalent method to np.append? If not, what is the best workaround? + +## Comments + +### Comment 1 by @Nucs (2019-12-07T17:49:22Z) + +Maybe np.concatenate, np.vstack or np.stack will help you. They might require reshaping to emulate np.append. + diff --git a/docs/issues/issue-0375-slice-assignment.md b/docs/issues/issue-0375-slice-assignment.md index f4225f8a..d633c533 100644 --- a/docs/issues/issue-0375-slice-assignment.md +++ b/docs/issues/issue-0375-slice-assignment.md @@ -1,25 +1,25 @@ -# #375: Slice assignment? +# #375: Slice assignment? + +- **URL:** https://github.com/SciSharp/NumSharp/issues/375 +- **State:** OPEN +- **Author:** @solarflarefx +- **Created:** 2019-12-07T17:40:06Z +- **Updated:** 2019-12-07T17:48:07Z +- **Labels:** missing feature/s +- **Assignees:** @Nucs + +## Description + +If you declare an array of a specific size, is there a way to assign slices of arrays? -- **URL:** https://github.com/SciSharp/NumSharp/issues/375 -- **State:** OPEN -- **Author:** @solarflarefx -- **Created:** 2019-12-07T17:40:06Z -- **Updated:** 2019-12-07T17:48:07Z -- **Labels:** missing feature/s -- **Assignees:** @Nucs +For example, if x is an NDArray of size (5,2,3,4), is there a way to do something like the following? -## Description +NDArray a = some NDArray of size (1,2,3,4) -If you declare an array of a specific size, is there a way to assign slices of arrays? - -For example, if x is an NDArray of size (5,2,3,4), is there a way to do something like the following? - -NDArray a = some NDArray of size (1,2,3,4) - -x[0,:,:,:] = a - -## Comments - -### Comment 1 by @Nucs (2019-12-07T17:47:58Z) - -Related to https://github.com/SciSharp/NumSharp/issues/369 https://github.com/SciSharp/NumSharp/issues/368 https://github.com/SciSharp/NumSharp/issues/366 and is work in progress. +x[0,:,:,:] = a + +## Comments + +### Comment 1 by @Nucs (2019-12-07T17:47:58Z) + +Related to https://github.com/SciSharp/NumSharp/issues/369 https://github.com/SciSharp/NumSharp/issues/368 https://github.com/SciSharp/NumSharp/issues/366 and is work in progress. diff --git a/docs/issues/issue-0378-add-np.frombuffer.md b/docs/issues/issue-0378-add-np.frombuffer.md index 881088ff..61e28922 100644 --- a/docs/issues/issue-0378-add-np.frombuffer.md +++ b/docs/issues/issue-0378-add-np.frombuffer.md @@ -1,14 +1,14 @@ -# #378: Add np.frombuffer - -- **URL:** https://github.com/SciSharp/NumSharp/issues/378 -- **State:** OPEN -- **Author:** @Nucs -- **Created:** 2019-12-15T19:39:07Z -- **Updated:** 2019-12-15T19:39:07Z -- **Labels:** enhancement, missing feature/s -- **Assignees:** @Nucs - -## Description - -This is how we should wrap a pointer to a certain memory block. -https://docs.scipy.org/doc/numpy/reference/generated/numpy.frombuffer.html +# #378: Add np.frombuffer + +- **URL:** https://github.com/SciSharp/NumSharp/issues/378 +- **State:** OPEN +- **Author:** @Nucs +- **Created:** 2019-12-15T19:39:07Z +- **Updated:** 2019-12-15T19:39:07Z +- **Labels:** enhancement, missing feature/s +- **Assignees:** @Nucs + +## Description + +This is how we should wrap a pointer to a certain memory block. +https://docs.scipy.org/doc/numpy/reference/generated/numpy.frombuffer.html diff --git a/docs/issues/issue-0383-is-there-any-way-to-convert-numsharp.ndarray-to-numpy.ndarray.md b/docs/issues/issue-0383-is-there-any-way-to-convert-numsharp.ndarray-to-numpy.ndarray.md index f2201a0e..5be8e58e 100644 --- a/docs/issues/issue-0383-is-there-any-way-to-convert-numsharp.ndarray-to-numpy.ndarray.md +++ b/docs/issues/issue-0383-is-there-any-way-to-convert-numsharp.ndarray-to-numpy.ndarray.md @@ -1,94 +1,94 @@ -# #383: is there any way to convert NumSharp.NDArray to Numpy.NDarray? +# #383: is there any way to convert NumSharp.NDArray to Numpy.NDarray? + +- **URL:** https://github.com/SciSharp/NumSharp/issues/383 +- **State:** OPEN +- **Author:** @lelelemonade +- **Created:** 2020-01-06T10:31:01Z +- **Updated:** 2023-02-24T10:15:20Z + +## Description + +_No description provided._ + +## Comments + +### Comment 1 by @Nucs (2020-01-06T11:15:15Z) + +Me and @henon have collaborated just two days ago on a solution for that, +The trick is to create a python scope, load a script that takes in a pointer-length and returns an np.ndarray +Remember! you have to keep reference to the original NDArray, otherwise the NDArray will be disposed and will release the memory. (@henon is there a tag field we can use in NDarray?) + +Note: the code below is psuedo, the rest of the code can be found here: [ConsoleApp9.zip](https://github.com/SciSharp/NumSharp/files/4025804/ConsoleApp9.zip) + + +*numpy_interop.py* as embedded resource +```python +import numpy as np +import ctypes + +def to_numpy(ptr, bytes, dtype, shape): + return np.frombuffer((ctypes.c_uint8*(bytes)).from_address(ptr), dtype).reshape(shape) -- **URL:** https://github.com/SciSharp/NumSharp/issues/383 -- **State:** OPEN -- **Author:** @lelelemonade -- **Created:** 2020-01-06T10:31:01Z -- **Updated:** 2023-02-24T10:15:20Z - -## Description - -_No description provided._ - -## Comments - -### Comment 1 by @Nucs (2020-01-06T11:15:15Z) - -Me and @henon have collaborated just two days ago on a solution for that, -The trick is to create a python scope, load a script that takes in a pointer-length and returns an np.ndarray -Remember! you have to keep reference to the original NDArray, otherwise the NDArray will be disposed and will release the memory. (@henon is there a tag field we can use in NDarray?) - -Note: the code below is psuedo, the rest of the code can be found here: [ConsoleApp9.zip](https://github.com/SciSharp/NumSharp/files/4025804/ConsoleApp9.zip) - - -*numpy_interop.py* as embedded resource -```python -import numpy as np -import ctypes - -def to_numpy(ptr, bytes, dtype, shape): - return np.frombuffer((ctypes.c_uint8*(bytes)).from_address(ptr), dtype).reshape(shape) - -``` - -*PythonExtensions.cs* -```C# -public static class PythonExtensions { - - ... - private static PyScope NumpyInteropScope; - private static PyObject NumpyConverter; - - public static unsafe NDarray ToNumpyNET(this NDArray nd) { - using (Py.GIL()) { - if (NumpyInteropScope == null) { - NumpyInteropScope = Py.CreateScope(); - NumpyInteropScope.ExecResource("numpy_interop.py"); - NumpyConverter = NumpyInteropScope.GetFunction("to_numpy"); - } - - return new NDarray(NumpyConverter.Invoke(new PyLong((long) nd.Unsafe.Address), - new PyLong(nd.size * nd.dtypesize), - new PyString(nd.dtype.Name.ToLowerInvariant()), - new PyTuple(nd.shape.Select(dim => (PyObject) new PyLong(dim)).ToArray()))); - } - } -} -``` - -*main.cs* -```C# -using numsharp_np = NumSharp.np; -using numpy_np = Numpy.np; -static void Main(string[] args) { - var numsharp_nd = numsharp_np.arange(10); - var numpy_nd = numsharp_nd.ToNumpyNET(); - numpy_nd[1] = (NDarray) 5; - Debug.Assert(numsharp_nd[1].array_equal(5)); - Console.WriteLine("numsharp_nd[1].array_equal(5) is indeed true!"); -} ``` -### Comment 2 by @Nucs (2020-01-06T11:35:04Z) - -Added some changes that will make sure the NDarray will hold reference to the NDArray as long as the PyObject doesnt change internally. - -[ConsoleApp9.zip](https://github.com/SciSharp/NumSharp/files/4025864/ConsoleApp9.zip) - - - -### Comment 3 by @henon (2020-01-06T15:13:53Z) - -> Remember! you have to keep reference to the original NDArray, otherwise the NDArray will be disposed and will release the memory. (@henon is there a tag field we can use in NDarray?) -> - -Not yet, but I will add one in Numpy.NET and support this. - - -### Comment 4 by @davidvct (2023-02-24T04:14:22Z) - -Hi, could you provide instruction on how to use the ConsoleApp9.zip? And does it able to convert Numpy array back to NumSharp array? - -### Comment 5 by @henon (2023-02-24T10:15:20Z) +*PythonExtensions.cs* +```C# +public static class PythonExtensions { + + ... + private static PyScope NumpyInteropScope; + private static PyObject NumpyConverter; + + public static unsafe NDarray ToNumpyNET(this NDArray nd) { + using (Py.GIL()) { + if (NumpyInteropScope == null) { + NumpyInteropScope = Py.CreateScope(); + NumpyInteropScope.ExecResource("numpy_interop.py"); + NumpyConverter = NumpyInteropScope.GetFunction("to_numpy"); + } + + return new NDarray(NumpyConverter.Invoke(new PyLong((long) nd.Unsafe.Address), + new PyLong(nd.size * nd.dtypesize), + new PyString(nd.dtype.Name.ToLowerInvariant()), + new PyTuple(nd.shape.Select(dim => (PyObject) new PyLong(dim)).ToArray()))); + } + } +} +``` -@davidvct, if I remember correctly I have added support for copying data to and from Numpy.NET like @Nucs did in this solution. Read this to see how: https://github.com/SciSharp/Numpy.NET#create-a-numpy-array-from-a-c-array-and-vice-versa +*main.cs* +```C# +using numsharp_np = NumSharp.np; +using numpy_np = Numpy.np; +static void Main(string[] args) { + var numsharp_nd = numsharp_np.arange(10); + var numpy_nd = numsharp_nd.ToNumpyNET(); + numpy_nd[1] = (NDarray) 5; + Debug.Assert(numsharp_nd[1].array_equal(5)); + Console.WriteLine("numsharp_nd[1].array_equal(5) is indeed true!"); +} +``` + +### Comment 2 by @Nucs (2020-01-06T11:35:04Z) + +Added some changes that will make sure the NDarray will hold reference to the NDArray as long as the PyObject doesnt change internally. + +[ConsoleApp9.zip](https://github.com/SciSharp/NumSharp/files/4025864/ConsoleApp9.zip) + + + +### Comment 3 by @henon (2020-01-06T15:13:53Z) + +> Remember! you have to keep reference to the original NDArray, otherwise the NDArray will be disposed and will release the memory. (@henon is there a tag field we can use in NDarray?) +> + +Not yet, but I will add one in Numpy.NET and support this. + + +### Comment 4 by @davidvct (2023-02-24T04:14:22Z) + +Hi, could you provide instruction on how to use the ConsoleApp9.zip? And does it able to convert Numpy array back to NumSharp array? + +### Comment 5 by @henon (2023-02-24T10:15:20Z) + +@davidvct, if I remember correctly I have added support for copying data to and from Numpy.NET like @Nucs did in this solution. Read this to see how: https://github.com/SciSharp/Numpy.NET#create-a-numpy-array-from-a-c-array-and-vice-versa diff --git a/docs/issues/issue-0384-save-ndarray-as-png-image.md b/docs/issues/issue-0384-save-ndarray-as-png-image.md index b640605e..0a1d5631 100644 --- a/docs/issues/issue-0384-save-ndarray-as-png-image.md +++ b/docs/issues/issue-0384-save-ndarray-as-png-image.md @@ -1,43 +1,43 @@ -# #384: Save NDArray as png image - -- **URL:** https://github.com/SciSharp/NumSharp/issues/384 -- **State:** OPEN -- **Author:** @solarflarefx -- **Created:** 2020-01-12T23:54:22Z -- **Updated:** 2020-01-13T00:30:55Z - -## Description - -I am looking to save an NDArray to an image. - -In Python code, I used the io.imsave() method from skimage.io. - -I tried using the approach shown here: https://stackoverflow.com/questions/5113919/how-to-convert-2-d-array-into-image-in-c-sharp - -Basically it uses the the Bitmap method in System.Drawing.Bitmap - -Is this the correct way to do this? - -I tried converting the NDArray to a C# multidimensional array and then using the following type of code: - -`Bitmap bitmap; -unsafe -{ - fixed (int* intPtr = &integers[0,0]) - { - bitmap = new Bitmap(width, height, stride, PixelFormat.Format32bppRgb, new IntPtr(intPtr)); - } -}` - -However, I get this error on the "bitmap =" line: System.ArgumentException: 'Parameter is not valid.' - -Ultimately I would like to compare the output from my python code to the output from my C# code to ensure that they are doing the same thing. As I stated, in Python I saved a multidimensional array to png. My thought was to do the same in C# using NumSharp, and then comparing the output images. - -Thanks in advance. - -## Comments - -### Comment 1 by @Nucs (2020-01-13T00:30:00Z) - -Take a look at our [wiki](https://github.com/SciSharp/NumSharp/wiki/Bitmap-Extensions). We provide support for converting/wrapping NDArray to System.Drawing.Bitmap. -If it is for the purpose of only saving then specify argument `copy: false` +# #384: Save NDArray as png image + +- **URL:** https://github.com/SciSharp/NumSharp/issues/384 +- **State:** OPEN +- **Author:** @solarflarefx +- **Created:** 2020-01-12T23:54:22Z +- **Updated:** 2020-01-13T00:30:55Z + +## Description + +I am looking to save an NDArray to an image. + +In Python code, I used the io.imsave() method from skimage.io. + +I tried using the approach shown here: https://stackoverflow.com/questions/5113919/how-to-convert-2-d-array-into-image-in-c-sharp + +Basically it uses the the Bitmap method in System.Drawing.Bitmap + +Is this the correct way to do this? + +I tried converting the NDArray to a C# multidimensional array and then using the following type of code: + +`Bitmap bitmap; +unsafe +{ + fixed (int* intPtr = &integers[0,0]) + { + bitmap = new Bitmap(width, height, stride, PixelFormat.Format32bppRgb, new IntPtr(intPtr)); + } +}` + +However, I get this error on the "bitmap =" line: System.ArgumentException: 'Parameter is not valid.' + +Ultimately I would like to compare the output from my python code to the output from my C# code to ensure that they are doing the same thing. As I stated, in Python I saved a multidimensional array to png. My thought was to do the same in C# using NumSharp, and then comparing the output images. + +Thanks in advance. + +## Comments + +### Comment 1 by @Nucs (2020-01-13T00:30:00Z) + +Take a look at our [wiki](https://github.com/SciSharp/NumSharp/wiki/Bitmap-Extensions). We provide support for converting/wrapping NDArray to System.Drawing.Bitmap. +If it is for the purpose of only saving then specify argument `copy: false` diff --git a/docs/issues/issue-0386-how-to-read-.csv-file-with-numsharp.md b/docs/issues/issue-0386-how-to-read-.csv-file-with-numsharp.md index bbea2df8..d296404f 100644 --- a/docs/issues/issue-0386-how-to-read-.csv-file-with-numsharp.md +++ b/docs/issues/issue-0386-how-to-read-.csv-file-with-numsharp.md @@ -1,18 +1,18 @@ -# #386: how to read .csv file with Numsharp? - -- **URL:** https://github.com/SciSharp/NumSharp/issues/386 -- **State:** OPEN -- **Author:** @guang7400613 -- **Created:** 2020-01-15T13:56:28Z -- **Updated:** 2020-01-15T14:09:27Z - -## Description - -how to read .csv file or .txt file wiht Numsharp(np) in C#? -is it np.load(string filename)? - -## Comments - -### Comment 1 by @Oceania2018 (2020-01-15T14:09:27Z) - -Should use Pandas.NET +# #386: how to read .csv file with Numsharp? + +- **URL:** https://github.com/SciSharp/NumSharp/issues/386 +- **State:** OPEN +- **Author:** @guang7400613 +- **Created:** 2020-01-15T13:56:28Z +- **Updated:** 2020-01-15T14:09:27Z + +## Description + +how to read .csv file or .txt file wiht Numsharp(np) in C#? +is it np.load(string filename)? + +## Comments + +### Comment 1 by @Oceania2018 (2020-01-15T14:09:27Z) + +Should use Pandas.NET diff --git a/docs/issues/issue-0390-how-to-create-an-ndarray-from-pointer-and-nptypecode.md b/docs/issues/issue-0390-how-to-create-an-ndarray-from-pointer-and-nptypecode.md index d82527ef..a4fca5da 100644 --- a/docs/issues/issue-0390-how-to-create-an-ndarray-from-pointer-and-nptypecode.md +++ b/docs/issues/issue-0390-how-to-create-an-ndarray-from-pointer-and-nptypecode.md @@ -1,52 +1,52 @@ -# #390: How to create an NDArray from pointer and NPTypeCode? - -- **URL:** https://github.com/SciSharp/NumSharp/issues/390 -- **State:** OPEN -- **Author:** @LarryThermo -- **Created:** 2020-01-24T19:52:51Z -- **Updated:** 2020-01-27T17:13:48Z - -## Description - -First of all thanks for this project. - -My code calls into lower level C++ code and I wish to represent the returned array as an NDArray in C#. I have a pointer to the data, the length of the data in bytes, as well as type code. How would I go about creating an NDArray for this case? Something like: - -NDArray CreateNDArray(void* data,int dataLengthBytes,NPTypeCode typeCode) -{ -var storage = new UnmanagedStorage( "something here" ); -var nda = new NDArray(storage); -return nda; -} - -Thanks, - -Lars - -## Comments - -### Comment 1 by @Oceania2018 (2020-01-24T23:19:00Z) - -@LarryThermo This [snippet of code](https://github.com/SciSharp/SharpCV/blob/792c8744856cff69f06ddfb17c2866d4d18a05db/src/SharpCV/Core/Mat.cs#L128) will help you. - -### Comment 2 by @LarryThermo (2020-01-27T17:13:48Z) - -Thank you. It was helpful. - -Although this works for me I was hoping to find a solution that did not involve maintaining a case statement for all possible types, and instead took in a void* pointer and an NPTypeCode. - -From: Haiping [mailto:notifications@github.com] -Sent: Friday, January 24, 2020 3:19 PM -To: SciSharp/NumSharp -Cc: Rystrom, Larry ; Mention -Subject: Re: [SciSharp/NumSharp] How to create an NDArray from pointer and NPTypeCode? (#390) - -CAUTION: This email originated from outside of Thermo Fisher Scientific. If you believe it to be suspicious, report using the Report Phish button in Outlook or send to SOC@thermofisher.com. - - -@LarryThermo This snippet of code will help you. - -— -You are receiving this because you were mentioned. -Reply to this email directly, view it on GitHub, or unsubscribe. - +# #390: How to create an NDArray from pointer and NPTypeCode? + +- **URL:** https://github.com/SciSharp/NumSharp/issues/390 +- **State:** OPEN +- **Author:** @LarryThermo +- **Created:** 2020-01-24T19:52:51Z +- **Updated:** 2020-01-27T17:13:48Z + +## Description + +First of all thanks for this project. + +My code calls into lower level C++ code and I wish to represent the returned array as an NDArray in C#. I have a pointer to the data, the length of the data in bytes, as well as type code. How would I go about creating an NDArray for this case? Something like: + +NDArray CreateNDArray(void* data,int dataLengthBytes,NPTypeCode typeCode) +{ +var storage = new UnmanagedStorage( "something here" ); +var nda = new NDArray(storage); +return nda; +} + +Thanks, + +Lars + +## Comments + +### Comment 1 by @Oceania2018 (2020-01-24T23:19:00Z) + +@LarryThermo This [snippet of code](https://github.com/SciSharp/SharpCV/blob/792c8744856cff69f06ddfb17c2866d4d18a05db/src/SharpCV/Core/Mat.cs#L128) will help you. + +### Comment 2 by @LarryThermo (2020-01-27T17:13:48Z) + +Thank you. It was helpful. + +Although this works for me I was hoping to find a solution that did not involve maintaining a case statement for all possible types, and instead took in a void* pointer and an NPTypeCode. + +From: Haiping [mailto:notifications@github.com] +Sent: Friday, January 24, 2020 3:19 PM +To: SciSharp/NumSharp +Cc: Rystrom, Larry ; Mention +Subject: Re: [SciSharp/NumSharp] How to create an NDArray from pointer and NPTypeCode? (#390) + +CAUTION: This email originated from outside of Thermo Fisher Scientific. If you believe it to be suspicious, report using the Report Phish button in Outlook or send to SOC@thermofisher.com. + + +@LarryThermo This snippet of code will help you. + +— +You are receiving this because you were mentioned. +Reply to this email directly, view it on GitHub, or unsubscribe. + diff --git a/docs/issues/issue-0396-bitmap.tondarray-problem-with-odd-bitmap-width.md b/docs/issues/issue-0396-bitmap.tondarray-problem-with-odd-bitmap-width.md index af5d4e90..7419dd91 100644 --- a/docs/issues/issue-0396-bitmap.tondarray-problem-with-odd-bitmap-width.md +++ b/docs/issues/issue-0396-bitmap.tondarray-problem-with-odd-bitmap-width.md @@ -1,40 +1,40 @@ -# #396: Bitmap.ToNDArray problem with odd bitmap width - -- **URL:** https://github.com/SciSharp/NumSharp/issues/396 -- **State:** OPEN -- **Author:** @herrvonregen -- **Created:** 2020-02-06T12:04:28Z -- **Updated:** 2020-02-06T16:44:23Z - -## Description - -Hi everyone. -The official micorsoft documenation for Bitmap.Stride says: - -> The stride is the width of a single row of pixels (a scan line), rounded up to a four-byte boundary. - -This could cause an exception here if the loaded bitmap is RGB with an odd width. -` Buffer.MemoryCopy(src, dst, bmpData.Stride * image.Height, nd.size);` -`var ret = nd.reshape(1, image.Height, image.Width, bmpData.Stride / bmpData.Width);` - -Example: -An RGB image with the size of 227x227 pixels -Stride will be 684. 227*3 = 681 rounded up to four-byte boundary. -Copied data are 155268 bytes. -Reshaped into 277 * 277 * floor(684/227) = 154587 bytes -This will cause an IncorrectShapeException - - - -## Comments - -### Comment 1 by @Nucs (2020-02-06T15:44:37Z) - -You shouldn't work hard, we provide extensions to Bitmap, see [this wiki article](https://github.com/SciSharp/NumSharp/wiki/Bitmap-Extensions). - -### Comment 2 by @herrvonregen (2020-02-06T16:44:23Z) - -Yes, I know but the implementation has the described behavior. -Try it with the picture provided below. -![00001](https://user-images.githubusercontent.com/33056845/73958447-39697500-4908-11ea-8628-33dce6582f17.jpg) - +# #396: Bitmap.ToNDArray problem with odd bitmap width + +- **URL:** https://github.com/SciSharp/NumSharp/issues/396 +- **State:** OPEN +- **Author:** @herrvonregen +- **Created:** 2020-02-06T12:04:28Z +- **Updated:** 2020-02-06T16:44:23Z + +## Description + +Hi everyone. +The official micorsoft documenation for Bitmap.Stride says: + +> The stride is the width of a single row of pixels (a scan line), rounded up to a four-byte boundary. + +This could cause an exception here if the loaded bitmap is RGB with an odd width. +` Buffer.MemoryCopy(src, dst, bmpData.Stride * image.Height, nd.size);` +`var ret = nd.reshape(1, image.Height, image.Width, bmpData.Stride / bmpData.Width);` + +Example: +An RGB image with the size of 227x227 pixels +Stride will be 684. 227*3 = 681 rounded up to four-byte boundary. +Copied data are 155268 bytes. +Reshaped into 277 * 277 * floor(684/227) = 154587 bytes +This will cause an IncorrectShapeException + + + +## Comments + +### Comment 1 by @Nucs (2020-02-06T15:44:37Z) + +You shouldn't work hard, we provide extensions to Bitmap, see [this wiki article](https://github.com/SciSharp/NumSharp/wiki/Bitmap-Extensions). + +### Comment 2 by @herrvonregen (2020-02-06T16:44:23Z) + +Yes, I know but the implementation has the described behavior. +Try it with the picture provided below. +![00001](https://user-images.githubusercontent.com/33056845/73958447-39697500-4908-11ea-8628-33dce6582f17.jpg) + diff --git a/docs/issues/issue-0397-missing-np.tile.md b/docs/issues/issue-0397-missing-np.tile.md index 0e72047f..cce93960 100644 --- a/docs/issues/issue-0397-missing-np.tile.md +++ b/docs/issues/issue-0397-missing-np.tile.md @@ -1,64 +1,64 @@ -# #397: Missing np.tile? +# #397: Missing np.tile? + +- **URL:** https://github.com/SciSharp/NumSharp/issues/397 +- **State:** OPEN +- **Author:** @QadiymStewart +- **Created:** 2020-02-12T15:55:12Z +- **Updated:** 2020-06-03T13:42:46Z +- **Assignees:** @Nucs + +## Description + +Is np.tile implemented in this library as of yet? + +## Comments + +### Comment 1 by @simonbuehler (2020-05-25T10:25:11Z) + +hi, + +bumped into the same issue, is there a workaround for something like `np.tile(center, (1, 1, 2 * num_anchors));` or maybe even better a working tile implementation? + +### Comment 2 by @QadiymStewart (2020-05-25T14:41:50Z) + +> hi, +> +> bumped into the same issue, is there a workaround for something like `np.tile(center, (1, 1, 2 * num_anchors));` or maybe even better a working tile implementation? + +Switched to https://github.com/Quansight-Labs/numpy.net + +### Comment 3 by @simonbuehler (2020-05-25T14:56:20Z) + +@QadiymStewart thanks for your reply, a pity that tensorflow.net depends on NumSharp so i can't switch :/ +@Oceania2018 are there plans to implement this like in[NumpyDotNet/shape_base.cs](https://github.com/Quansight-Labs/numpy.net/blob/b6ac4af87e21bd561a022ebe067d322b88273157/src/NumpyDotNet/NumpyDotNet/shape_base.cs#L1623) ? + +### Comment 4 by @Oceania2018 (2020-05-25T15:23:08Z) + +@simonbuehler Try to use the built-in functions of tensorflow. https://www.tensorflow.org/api_docs/python/tf/tile + +### Comment 5 by @simonbuehler (2020-05-25T17:54:25Z) + +is there already a nuget with a Tensor -> NDarray method? + +### Comment 6 by @Oceania2018 (2020-05-26T03:38:36Z) + +@simonbuehler You can create tensor directly from Tensor -> NDArray and vice verse. + +### Comment 7 by @simonbuehler (2020-05-26T08:54:41Z) + +just for info, unfortunatly `var center_tiled = tf.tile(temp , temp2);` throws a `NullReferenceException` guess this is a TensorFlow.NET issue, nevertheless a numsharp implementation would be awesome! -- **URL:** https://github.com/SciSharp/NumSharp/issues/397 -- **State:** OPEN -- **Author:** @QadiymStewart -- **Created:** 2020-02-12T15:55:12Z -- **Updated:** 2020-06-03T13:42:46Z -- **Assignees:** @Nucs - -## Description - -Is np.tile implemented in this library as of yet? - -## Comments - -### Comment 1 by @simonbuehler (2020-05-25T10:25:11Z) - -hi, - -bumped into the same issue, is there a workaround for something like `np.tile(center, (1, 1, 2 * num_anchors));` or maybe even better a working tile implementation? - -### Comment 2 by @QadiymStewart (2020-05-25T14:41:50Z) - -> hi, -> -> bumped into the same issue, is there a workaround for something like `np.tile(center, (1, 1, 2 * num_anchors));` or maybe even better a working tile implementation? - -Switched to https://github.com/Quansight-Labs/numpy.net - -### Comment 3 by @simonbuehler (2020-05-25T14:56:20Z) - -@QadiymStewart thanks for your reply, a pity that tensorflow.net depends on NumSharp so i can't switch :/ -@Oceania2018 are there plans to implement this like in[NumpyDotNet/shape_base.cs](https://github.com/Quansight-Labs/numpy.net/blob/b6ac4af87e21bd561a022ebe067d322b88273157/src/NumpyDotNet/NumpyDotNet/shape_base.cs#L1623) ? - -### Comment 4 by @Oceania2018 (2020-05-25T15:23:08Z) - -@simonbuehler Try to use the built-in functions of tensorflow. https://www.tensorflow.org/api_docs/python/tf/tile - -### Comment 5 by @simonbuehler (2020-05-25T17:54:25Z) - -is there already a nuget with a Tensor -> NDarray method? - -### Comment 6 by @Oceania2018 (2020-05-26T03:38:36Z) - -@simonbuehler You can create tensor directly from Tensor -> NDArray and vice verse. - -### Comment 7 by @simonbuehler (2020-05-26T08:54:41Z) - -just for info, unfortunatly `var center_tiled = tf.tile(temp , temp2);` throws a `NullReferenceException` guess this is a TensorFlow.NET issue, nevertheless a numsharp implementation would be awesome! - -``` - TensorFlow.NET.dll!Tensorflow.Tensor._as_tf_output() Unbekannt - TensorFlow.NET.dll!Tensorflow.ops._create_c_op(Tensorflow.Graph graph, Tensorflow.NodeDef node_def, object[] inputs, Tensorflow.Operation[] control_inputs) Unbekannt - TensorFlow.NET.dll!Tensorflow.Operation.Operation(Tensorflow.NodeDef node_def, Tensorflow.Graph g, Tensorflow.Tensor[] inputs, Tensorflow.TF_DataType[] output_types, Tensorflow.ITensorOrOperation[] control_inputs, Tensorflow.TF_DataType[] input_types, string original_op, Tensorflow.OpDef op_def) Unbekannt - TensorFlow.NET.dll!Tensorflow.Graph.create_op(string op_type, Tensorflow.Tensor[] inputs, Tensorflow.TF_DataType[] dtypes, Tensorflow.TF_DataType[] input_types, string name, System.Collections.Generic.Dictionary attrs, Tensorflow.OpDef op_def) Unbekannt - TensorFlow.NET.dll!Tensorflow.OpDefLibrary._apply_op_helper.AnonymousMethod__0(Tensorflow.ops.NameScope scope) Unbekannt - TensorFlow.NET.dll!Tensorflow.Binding.tf_with(System.__Canon py, System.Func action) Unbekannt - TensorFlow.NET.dll!Tensorflow.gen_array_ops.tile(Tensorflow.Tensor input, Tensorflow.Tensor multiples, string name) Unbekannt - ``` - -### Comment 8 by @simonbuehler (2020-06-03T13:42:46Z) - -@Oceania2018 hi, are there any chances that np.tile could be implemented? + TensorFlow.NET.dll!Tensorflow.Tensor._as_tf_output() Unbekannt + TensorFlow.NET.dll!Tensorflow.ops._create_c_op(Tensorflow.Graph graph, Tensorflow.NodeDef node_def, object[] inputs, Tensorflow.Operation[] control_inputs) Unbekannt + TensorFlow.NET.dll!Tensorflow.Operation.Operation(Tensorflow.NodeDef node_def, Tensorflow.Graph g, Tensorflow.Tensor[] inputs, Tensorflow.TF_DataType[] output_types, Tensorflow.ITensorOrOperation[] control_inputs, Tensorflow.TF_DataType[] input_types, string original_op, Tensorflow.OpDef op_def) Unbekannt + TensorFlow.NET.dll!Tensorflow.Graph.create_op(string op_type, Tensorflow.Tensor[] inputs, Tensorflow.TF_DataType[] dtypes, Tensorflow.TF_DataType[] input_types, string name, System.Collections.Generic.Dictionary attrs, Tensorflow.OpDef op_def) Unbekannt + TensorFlow.NET.dll!Tensorflow.OpDefLibrary._apply_op_helper.AnonymousMethod__0(Tensorflow.ops.NameScope scope) Unbekannt + TensorFlow.NET.dll!Tensorflow.Binding.tf_with(System.__Canon py, System.Func action) Unbekannt + TensorFlow.NET.dll!Tensorflow.gen_array_ops.tile(Tensorflow.Tensor input, Tensorflow.Tensor multiples, string name) Unbekannt + +``` + +### Comment 8 by @simonbuehler (2020-06-03T13:42:46Z) + +@Oceania2018 hi, are there any chances that np.tile could be implemented? diff --git a/docs/issues/issue-0398-typo-in-library-np.random.stardard.md b/docs/issues/issue-0398-typo-in-library-np.random.stardard.md index 93d5ef03..5eaca1df 100644 --- a/docs/issues/issue-0398-typo-in-library-np.random.stardard.md +++ b/docs/issues/issue-0398-typo-in-library-np.random.stardard.md @@ -1,18 +1,18 @@ -# #398: Typo in library np.random.stardard +# #398: Typo in library np.random.stardard + +- **URL:** https://github.com/SciSharp/NumSharp/issues/398 +- **State:** OPEN +- **Author:** @QadiymStewart +- **Created:** 2020-02-12T16:29:28Z +- **Updated:** 2020-02-12T16:29:28Z + +## Description + +Found a typo + np.random.stardard_normal(Batch_Size, X_Res * Y_Res, 1); -- **URL:** https://github.com/SciSharp/NumSharp/issues/398 -- **State:** OPEN -- **Author:** @QadiymStewart -- **Created:** 2020-02-12T16:29:28Z -- **Updated:** 2020-02-12T16:29:28Z +should be + np.random.standard_normal(Batch_Size, X_Res * Y_Res, 1); -## Description - -Found a typo - np.random.stardard_normal(Batch_Size, X_Res * Y_Res, 1); - -should be - np.random.standard_normal(Batch_Size, X_Res * Y_Res, 1); - -Spelling Error "standard" - +Spelling Error "standard" + diff --git a/docs/issues/issue-0401-how-to-convert-ndarray-to-list.md b/docs/issues/issue-0401-how-to-convert-ndarray-to-list.md index 6c7600fc..b5d2bad8 100644 --- a/docs/issues/issue-0401-how-to-convert-ndarray-to-list.md +++ b/docs/issues/issue-0401-how-to-convert-ndarray-to-list.md @@ -1,90 +1,90 @@ -# #401: How to convert NDArray to list - -- **URL:** https://github.com/SciSharp/NumSharp/issues/401 -- **State:** OPEN -- **Author:** @Sullivanecidi -- **Created:** 2020-03-18T00:26:17Z -- **Updated:** 2020-03-30T02:57:02Z - -## Description - -It is really a big surprise for me to find the Numsharp. -Here is little question with using the NumSharp: How to convert the NDArray data to list ? since in VB.net, list is the frequently used. -For example: -dim x_data, y_data as NDArray -dim y() as double -x_data = np.linspace(0,100,500) -y_data = x_data * 2 + np.random.randn(500) - -how to convert y_data to y() ? - -Thanks! - -## Comments - -### Comment 1 by @Oceania2018 (2020-03-18T02:35:02Z) - -`x_data.ToArray()` - -### Comment 2 by @Sullivanecidi (2020-03-18T03:05:49Z) - -> `x_data.ToArray()` - -Do you mean y = y_data.ToArray(of double)() -it doesn't work at all...... - -### Comment 3 by @Jiuyong (2020-03-18T05:45:07Z) - -VB.Net don't support Of **unmanaged** -目前看到的情况是,VB.Net 不支持 C# 7.3 新的 **unmanaged** 泛型约束。 -如果想要使用,可能需要变通一下了。 - -### Comment 4 by @pepure (2020-03-18T06:57:27Z) - -> > `x_data.ToArray()` -> -> Do you mean y = y_data.ToArray(of double)() -> it doesn't work at all...... - -I offer a lower level solution:) --------------------------------------------------------- -Dim x_data, y_data As NDArray -x_data = np.linspace(0, 100, 500) -y_data = x_data * 2 + np.random.randn(500) - -Dim y(y_data.size - 1) As Double -For i = 0 To y_data.size - 1 - y(i) = y_data(i) -Next i --------------------------------------------------------- -Debugging results: -![image](https://user-images.githubusercontent.com/53322892/76933706-b1c04e80-6928-11ea-9825-aa453c80421b.png) -Please confirm if it can solve your problem。 - - -### Comment 5 by @Sullivanecidi (2020-03-18T07:23:03Z) - -> VB.Net don't support Of **unmanaged** -> 目前看到的情况是,VB.Net 不支持 C# 7.3 新的 **unmanaged** 泛型约束。 -> 如果想要使用,可能需要变通一下了。 - -那就可能是按照楼上这位了,一个一个取出来。谢谢你了~ - -### Comment 6 by @Sullivanecidi (2020-03-18T07:25:10Z) - -Thanks very much! this is the alternative way, since VB.net don't support the unmanaged constraint. - - -### Comment 7 by @Sullivanecidi (2020-03-18T08:38:54Z) - -> VB.Net don't support Of **unmanaged** -> 目前看到的情况是,VB.Net 不支持 C# 7.3 新的 **unmanaged** 泛型约束。 -> 如果想要使用,可能需要变通一下了。 - -我刚试了下c#,是可以用toArray()实现的。 - -### Comment 8 by @Jiuyong (2020-03-30T02:57:02Z) - -是的,C#肯定没问题啊。 -还有个稍微好一点的解决方案。 -就是用C#弄一个缝合项目,然后VB项目引用。 +# #401: How to convert NDArray to list + +- **URL:** https://github.com/SciSharp/NumSharp/issues/401 +- **State:** OPEN +- **Author:** @Sullivanecidi +- **Created:** 2020-03-18T00:26:17Z +- **Updated:** 2020-03-30T02:57:02Z + +## Description + +It is really a big surprise for me to find the Numsharp. +Here is little question with using the NumSharp: How to convert the NDArray data to list ? since in VB.net, list is the frequently used. +For example: +dim x_data, y_data as NDArray +dim y() as double +x_data = np.linspace(0,100,500) +y_data = x_data * 2 + np.random.randn(500) + +how to convert y_data to y() ? + +Thanks! + +## Comments + +### Comment 1 by @Oceania2018 (2020-03-18T02:35:02Z) + +`x_data.ToArray()` + +### Comment 2 by @Sullivanecidi (2020-03-18T03:05:49Z) + +> `x_data.ToArray()` + +Do you mean y = y_data.ToArray(of double)() +it doesn't work at all...... + +### Comment 3 by @Jiuyong (2020-03-18T05:45:07Z) + +VB.Net don't support Of **unmanaged** +目前看到的情况是,VB.Net 不支持 C# 7.3 新的 **unmanaged** 泛型约束。 +如果想要使用,可能需要变通一下了。 + +### Comment 4 by @pepure (2020-03-18T06:57:27Z) + +> > `x_data.ToArray()` +> +> Do you mean y = y_data.ToArray(of double)() +> it doesn't work at all...... + +I offer a lower level solution:) +-------------------------------------------------------- +Dim x_data, y_data As NDArray +x_data = np.linspace(0, 100, 500) +y_data = x_data * 2 + np.random.randn(500) + +Dim y(y_data.size - 1) As Double +For i = 0 To y_data.size - 1 + y(i) = y_data(i) +Next i +-------------------------------------------------------- +Debugging results: +![image](https://user-images.githubusercontent.com/53322892/76933706-b1c04e80-6928-11ea-9825-aa453c80421b.png) +Please confirm if it can solve your problem。 + + +### Comment 5 by @Sullivanecidi (2020-03-18T07:23:03Z) + +> VB.Net don't support Of **unmanaged** +> 目前看到的情况是,VB.Net 不支持 C# 7.3 新的 **unmanaged** 泛型约束。 +> 如果想要使用,可能需要变通一下了。 + +那就可能是按照楼上这位了,一个一个取出来。谢谢你了~ + +### Comment 6 by @Sullivanecidi (2020-03-18T07:25:10Z) + +Thanks very much! this is the alternative way, since VB.net don't support the unmanaged constraint. + + +### Comment 7 by @Sullivanecidi (2020-03-18T08:38:54Z) + +> VB.Net don't support Of **unmanaged** +> 目前看到的情况是,VB.Net 不支持 C# 7.3 新的 **unmanaged** 泛型约束。 +> 如果想要使用,可能需要变通一下了。 + +我刚试了下c#,是可以用toArray()实现的。 + +### Comment 8 by @Jiuyong (2020-03-30T02:57:02Z) + +是的,C#肯定没问题啊。 +还有个稍微好一点的解决方案。 +就是用C#弄一个缝合项目,然后VB项目引用。 diff --git a/docs/issues/issue-0405-np.argsort-not-sorting-properly.md b/docs/issues/issue-0405-np.argsort-not-sorting-properly.md index 11784d71..07d47cd7 100644 --- a/docs/issues/issue-0405-np.argsort-not-sorting-properly.md +++ b/docs/issues/issue-0405-np.argsort-not-sorting-properly.md @@ -1,38 +1,38 @@ -# #405: np.argsort not sorting properly +# #405: np.argsort not sorting properly + +- **URL:** https://github.com/SciSharp/NumSharp/issues/405 +- **State:** OPEN +- **Author:** @tk4218 +- **Created:** 2020-04-09T18:35:33Z +- **Updated:** 2020-04-09T21:18:51Z + +## Description + +I am attempting to call np.argsort() on the following array: +[0.700656592845917, 0.651415288448334, 0.719015657901764] dtype = Double -- **URL:** https://github.com/SciSharp/NumSharp/issues/405 -- **State:** OPEN -- **Author:** @tk4218 -- **Created:** 2020-04-09T18:35:33Z -- **Updated:** 2020-04-09T21:18:51Z +The expected result should be: +[1, 0, 2] -## Description +However, the actual result I'm getting is: +[0, 2, 1] -I am attempting to call np.argsort() on the following array: -[0.700656592845917, 0.651415288448334, 0.719015657901764] dtype = Double - -The expected result should be: -[1, 0, 2] - -However, the actual result I'm getting is: -[0, 2, 1] - -This doesn't to produce a result that is sorted in any direction. I pulled in ndarray.argsort locally and changed line 31 - -from: `var data = Array;` -to: `var data = ToArray()` -(Also changing the declaration of the function to include `where T : unmanaged `) - -And this seemed to work for me. +This doesn't to produce a result that is sorted in any direction. I pulled in ndarray.argsort locally and changed line 31 - +from: `var data = Array;` +to: `var data = ToArray()` +(Also changing the declaration of the function to include `where T : unmanaged `) +And this seemed to work for me. + + +## Comments + +### Comment 1 by @tk4218 (2020-04-09T21:18:51Z) + +After trying things out for awhile, it seems I can get np.argsort to work if I pass a copy of the NDArray to it. It seems like the NDArray is being manipulated while sorting, causing the sort to misbehave. -## Comments +It seems like np.argsort should be: +`nd.copy().argsort(axis)` -### Comment 1 by @tk4218 (2020-04-09T21:18:51Z) - -After trying things out for awhile, it seems I can get np.argsort to work if I pass a copy of the NDArray to it. It seems like the NDArray is being manipulated while sorting, causing the sort to misbehave. - -It seems like np.argsort should be: -`nd.copy().argsort(axis)` - -rather than: -`nd.argsort(axis)` +rather than: +`nd.argsort(axis)` diff --git a/docs/issues/issue-0406-c-convert-image-to-ndarray.md b/docs/issues/issue-0406-c-convert-image-to-ndarray.md index 6920a82c..cb60c950 100644 --- a/docs/issues/issue-0406-c-convert-image-to-ndarray.md +++ b/docs/issues/issue-0406-c-convert-image-to-ndarray.md @@ -1,20 +1,20 @@ -# #406: C# --> convert image to NDarray +# #406: C# --> convert image to NDarray + +- **URL:** https://github.com/SciSharp/NumSharp/issues/406 +- **State:** OPEN +- **Author:** @R06921096Yen +- **Created:** 2020-04-20T11:39:16Z +- **Updated:** 2020-05-22T09:06:36Z + +## Description + +Does anyone know how to convert "System.Drawing.Image" to "NDarray" in C#? +Any suggestions would be greatly appreciated. + +## Comments + +### Comment 1 by @chriss2401 (2020-05-22T09:06:35Z) + +Could this extension class help ? -- **URL:** https://github.com/SciSharp/NumSharp/issues/406 -- **State:** OPEN -- **Author:** @R06921096Yen -- **Created:** 2020-04-20T11:39:16Z -- **Updated:** 2020-05-22T09:06:36Z - -## Description - -Does anyone know how to convert "System.Drawing.Image" to "NDarray" in C#? -Any suggestions would be greatly appreciated. - -## Comments - -### Comment 1 by @chriss2401 (2020-05-22T09:06:35Z) - -Could this extension class help ? - -https://github.com/SciSharp/NumSharp/blob/master/src/NumSharp.Bitmap/np_.extensions.cs +https://github.com/SciSharp/NumSharp/blob/master/src/NumSharp.Bitmap/np_.extensions.cs diff --git a/docs/issues/issue-0407-np.negative-is-not-working.md b/docs/issues/issue-0407-np.negative-is-not-working.md index 2a0d7eed..a40f812f 100644 --- a/docs/issues/issue-0407-np.negative-is-not-working.md +++ b/docs/issues/issue-0407-np.negative-is-not-working.md @@ -1,35 +1,35 @@ -# #407: np.negative is not working ? +# #407: np.negative is not working ? + +- **URL:** https://github.com/SciSharp/NumSharp/issues/407 +- **State:** OPEN +- **Author:** @LordTrololo +- **Created:** 2020-04-21T07:52:19Z +- **Updated:** 2020-04-21T13:56:16Z +- **Assignees:** @Nucs + +## Description + +Hi, -- **URL:** https://github.com/SciSharp/NumSharp/issues/407 -- **State:** OPEN -- **Author:** @LordTrololo -- **Created:** 2020-04-21T07:52:19Z -- **Updated:** 2020-04-21T13:56:16Z -- **Assignees:** @Nucs +I have a NDArray of Floats with dimensions {(1, 13, 13, 3, 2)} and size 1014. -## Description +`np.negative(myArray)` -Hi, - -I have a NDArray of Floats with dimensions {(1, 13, 13, 3, 2)} and size 1014. - -`np.negative(myArray)` - -works by converting all values to negative. However I think that [official Numpy behaviour](https://numpy.org/doc/stable/reference/generated/numpy.negative.html?highlight=negative#numpy.negative) is to convert positives to negatives and negatives to positives. - -Like so: -``` -np.negative([1.,-1.]) -array([-1., 1.]) - -``` - -What I get is: -``` -np.negative([1.,-1.]) -array([-1., -1.]) -``` -Did someone experience similar problem ? - -BTW, the solution I use to solve the problem is trivial - -`var negativeArray = myarray*(-1);` +works by converting all values to negative. However I think that [official Numpy behaviour](https://numpy.org/doc/stable/reference/generated/numpy.negative.html?highlight=negative#numpy.negative) is to convert positives to negatives and negatives to positives. + +Like so: +``` +np.negative([1.,-1.]) +array([-1., 1.]) + +``` + +What I get is: +``` +np.negative([1.,-1.]) +array([-1., -1.]) +``` +Did someone experience similar problem ? + +BTW, the solution I use to solve the problem is trivial - +`var negativeArray = myarray*(-1);` diff --git a/docs/issues/issue-0408-np.meshgrid-has-a-hidden-error-returning-wrong-results.md b/docs/issues/issue-0408-np.meshgrid-has-a-hidden-error-returning-wrong-results.md index 040825b5..dac63777 100644 --- a/docs/issues/issue-0408-np.meshgrid-has-a-hidden-error-returning-wrong-results.md +++ b/docs/issues/issue-0408-np.meshgrid-has-a-hidden-error-returning-wrong-results.md @@ -1,55 +1,55 @@ -# #408: np.meshgrid() has a hidden error returning wrong results - -- **URL:** https://github.com/SciSharp/NumSharp/issues/408 -- **State:** OPEN -- **Author:** @LordTrololo -- **Created:** 2020-04-23T10:38:03Z -- **Updated:** 2021-07-15T12:26:10Z - -## Description - -There seems to be a bug in the `np.meshgrid()` function. It has something to do with the way the unmanaged memory is handeld but I havent tried to understand the details. - -Why hidden ? Well, lets say we have the following code: -``` -var meshAB = np.meshgrid(np.arange(3), np.arange(3)); -``` - -`meshAB.Item1` seems to be ok, but `meshAB.Item2` hides a nasty problem. -Strangely enough, when one makes a clone of Item2, the cloned values are OK! This is also my quick fix for now. - -So to summary, the code below: -``` -var meshAB = np.meshgrid(np.arange(3), np.arange(3)); -Console.WriteLine("meshAB.Item1.flatten(): " + meshAB.Item1.flatten().ToString()); -Console.WriteLine("meshAB.Item2.flatten(): " + meshAB.Item2.flatten().ToString()); - -NDArray a = meshAB.Item1.Clone(); -NDArray b = meshAB.Item2.Clone(); - -Console.WriteLine("a.flatten(): " +a.flatten().ToString()); -Console.WriteLine("b.flatten(): " +b.flatten().ToString()); -``` - -Will output: -``` -meshAB.Item1.flatten(): [0, 1, 2, 0, 1, 2, 0, 1, 2] -meshAB.Item2.flatten(): [0, 1, 2, 0, 1, 2, 0, 1, 2] <-------WRONG -a.flatten(): [0, 1, 2, 0, 1, 2, 0, 1, 2] -b.flatten(): [0, 0, 0, 1, 1, 1, 2, 2, 2] <------ CORRECT -``` -The bug is nasty because in inspector we also see ok values which is not true. Here is an image: -![image](https://user-images.githubusercontent.com/61494668/80100219-f6ff1e00-856f-11ea-8da8-91caf7e164af.png) - - -## Comments - -### Comment 1 by @ArthHil (2021-07-15T10:48:05Z) - -Same problem, but clone didnt resolve the problem - -### Comment 2 by @Oceania2018 (2021-07-15T12:24:32Z) - -I tested it in [tf.net preview](https://github.com/SciSharp/TensorFlow.NET/blob/16ff7a3dafd283b07d91f61a88e0743a3c47c9fc/test/TensorFlowNET.UnitTest/Numpy/Array.Creation.Test.cs#L69). It's working good. -![image](https://user-images.githubusercontent.com/1705364/125787200-59813f3a-616e-4b44-9f1a-435fc17fe3b2.png) -New version implemented the NumPy API in [TensorFlow NumPy](https://www.tensorflow.org/guide/tf_numpy) +# #408: np.meshgrid() has a hidden error returning wrong results + +- **URL:** https://github.com/SciSharp/NumSharp/issues/408 +- **State:** OPEN +- **Author:** @LordTrololo +- **Created:** 2020-04-23T10:38:03Z +- **Updated:** 2021-07-15T12:26:10Z + +## Description + +There seems to be a bug in the `np.meshgrid()` function. It has something to do with the way the unmanaged memory is handeld but I havent tried to understand the details. + +Why hidden ? Well, lets say we have the following code: +``` +var meshAB = np.meshgrid(np.arange(3), np.arange(3)); +``` + +`meshAB.Item1` seems to be ok, but `meshAB.Item2` hides a nasty problem. +Strangely enough, when one makes a clone of Item2, the cloned values are OK! This is also my quick fix for now. + +So to summary, the code below: +``` +var meshAB = np.meshgrid(np.arange(3), np.arange(3)); +Console.WriteLine("meshAB.Item1.flatten(): " + meshAB.Item1.flatten().ToString()); +Console.WriteLine("meshAB.Item2.flatten(): " + meshAB.Item2.flatten().ToString()); + +NDArray a = meshAB.Item1.Clone(); +NDArray b = meshAB.Item2.Clone(); + +Console.WriteLine("a.flatten(): " +a.flatten().ToString()); +Console.WriteLine("b.flatten(): " +b.flatten().ToString()); +``` + +Will output: +``` +meshAB.Item1.flatten(): [0, 1, 2, 0, 1, 2, 0, 1, 2] +meshAB.Item2.flatten(): [0, 1, 2, 0, 1, 2, 0, 1, 2] <-------WRONG +a.flatten(): [0, 1, 2, 0, 1, 2, 0, 1, 2] +b.flatten(): [0, 0, 0, 1, 1, 1, 2, 2, 2] <------ CORRECT +``` +The bug is nasty because in inspector we also see ok values which is not true. Here is an image: +![image](https://user-images.githubusercontent.com/61494668/80100219-f6ff1e00-856f-11ea-8da8-91caf7e164af.png) + + +## Comments + +### Comment 1 by @ArthHil (2021-07-15T10:48:05Z) + +Same problem, but clone didnt resolve the problem + +### Comment 2 by @Oceania2018 (2021-07-15T12:24:32Z) + +I tested it in [tf.net preview](https://github.com/SciSharp/TensorFlow.NET/blob/16ff7a3dafd283b07d91f61a88e0743a3c47c9fc/test/TensorFlowNET.UnitTest/Numpy/Array.Creation.Test.cs#L69). It's working good. +![image](https://user-images.githubusercontent.com/1705364/125787200-59813f3a-616e-4b44-9f1a-435fc17fe3b2.png) +New version implemented the NumPy API in [TensorFlow NumPy](https://www.tensorflow.org/guide/tf_numpy) diff --git a/docs/issues/issue-0410-np.save-fails-with-indexoutofrangeexception-for-jagged-arrays.md b/docs/issues/issue-0410-np.save-fails-with-indexoutofrangeexception-for-jagged-arrays.md index 5ff6d3d8..8d4a359d 100644 --- a/docs/issues/issue-0410-np.save-fails-with-indexoutofrangeexception-for-jagged-arrays.md +++ b/docs/issues/issue-0410-np.save-fails-with-indexoutofrangeexception-for-jagged-arrays.md @@ -1,40 +1,40 @@ -# #410: np.save fails with IndexOutOfRangeException for jagged arrays +# #410: np.save fails with IndexOutOfRangeException for jagged arrays + +- **URL:** https://github.com/SciSharp/NumSharp/issues/410 +- **State:** OPEN +- **Author:** @Jmerk523 +- **Created:** 2020-05-08T01:00:52Z +- **Updated:** 2020-05-08T01:00:52Z + +## Description + +Hi, +I am seeing this exception when trying to save a jagged array to a stream: -- **URL:** https://github.com/SciSharp/NumSharp/issues/410 -- **State:** OPEN -- **Author:** @Jmerk523 -- **Created:** 2020-05-08T01:00:52Z -- **Updated:** 2020-05-08T01:00:52Z +Index was outside the bounds of the array. + at NumSharp.np.d__109`1.MoveNext() + at NumSharp.np.writeValueJagged(BinaryWriter reader, Array matrix, Int32 bytes, Int32[] shape) + at NumSharp.np.Save(Array array, Stream stream) -## Description +I haven't pinpointed the root cause specifically, but it seems that there is some issue with jagged arrays when the outer array has rank 1: -Hi, -I am seeing this exception when trying to save a jagged array to a stream: - -Index was outside the bounds of the array. - at NumSharp.np.d__109`1.MoveNext() - at NumSharp.np.writeValueJagged(BinaryWriter reader, Array matrix, Int32 bytes, Int32[] shape) - at NumSharp.np.Save(Array array, Stream stream) - -I haven't pinpointed the root cause specifically, but it seems that there is some issue with jagged arrays when the outer array has rank 1: - -``` - static IEnumerable Enumerate(Array a, int[] dimensions, int pos) - { - if (pos == dimensions.Length - 1) - { - for (int i = 0; i < dimensions[pos]; i++) - yield return (T)a.GetValue(i); - } - else - { - for (int i = 0; i < dimensions[pos]; i++) - foreach (var subArray in Enumerate(a.GetValue(i) as Array, dimensions, pos + 1)) - yield return subArray; - } - } -``` -When pos == 0 and dimensions[] has length 0, the else will execute and pos(0) will be out of bounds. -dimensions[] has length 0 from the caller, which passes: -` int[] first = shape.Take(shape.Length - 1).ToArray();` -so first[] will be an empty array when shape has length 1 (as in, the single dimension of the 1 dimensional outer jagged array). +``` + static IEnumerable Enumerate(Array a, int[] dimensions, int pos) + { + if (pos == dimensions.Length - 1) + { + for (int i = 0; i < dimensions[pos]; i++) + yield return (T)a.GetValue(i); + } + else + { + for (int i = 0; i < dimensions[pos]; i++) + foreach (var subArray in Enumerate(a.GetValue(i) as Array, dimensions, pos + 1)) + yield return subArray; + } + } +``` +When pos == 0 and dimensions[] has length 0, the else will execute and pos(0) will be out of bounds. +dimensions[] has length 0 from the caller, which passes: +` int[] first = shape.Take(shape.Length - 1).ToArray();` +so first[] will be an empty array when shape has length 1 (as in, the single dimension of the 1 dimensional outer jagged array). diff --git a/docs/issues/issue-0411-pyobject-to-ndarray.md b/docs/issues/issue-0411-pyobject-to-ndarray.md index 3cb07567..f04612e8 100644 --- a/docs/issues/issue-0411-pyobject-to-ndarray.md +++ b/docs/issues/issue-0411-pyobject-to-ndarray.md @@ -1,16 +1,16 @@ -# #411: PyObject to NDArray +# #411: PyObject to NDArray + +- **URL:** https://github.com/SciSharp/NumSharp/issues/411 +- **State:** OPEN +- **Author:** @aaronavi +- **Created:** 2020-05-20T11:24:41Z +- **Updated:** 2020-05-20T11:24:41Z + +## Description + +Hi +I have a PyObject which is of a PyDict type, It contains an NDArray, i need to convert it to actual NDArray. -- **URL:** https://github.com/SciSharp/NumSharp/issues/411 -- **State:** OPEN -- **Author:** @aaronavi -- **Created:** 2020-05-20T11:24:41Z -- **Updated:** 2020-05-20T11:24:41Z +How can i do that? -## Description - -Hi -I have a PyObject which is of a PyDict type, It contains an NDArray, i need to convert it to actual NDArray. - -How can i do that? - -Thanks +Thanks diff --git a/docs/issues/issue-0412-the-type-ndarray-exists-in-both-numsharp.core-version-0.20.5.0-and-numsh.md b/docs/issues/issue-0412-the-type-ndarray-exists-in-both-numsharp.core-version-0.20.5.0-and-numsh.md index 39d2c61f..019c39ad 100644 --- a/docs/issues/issue-0412-the-type-ndarray-exists-in-both-numsharp.core-version-0.20.5.0-and-numsh.md +++ b/docs/issues/issue-0412-the-type-ndarray-exists-in-both-numsharp.core-version-0.20.5.0-and-numsh.md @@ -1,18 +1,18 @@ -# #412: The type 'NDArray' exists in both 'NumSharp.Core, Version=0.20.5.0, ' and 'NumSharp.Lite, Version=0.1.7.0, - -- **URL:** https://github.com/SciSharp/NumSharp/issues/412 -- **State:** OPEN -- **Author:** @sportbilly21 -- **Created:** 2020-05-27T11:43:26Z -- **Updated:** 2020-05-27T11:43:26Z - -## Description - -Hi -I am trying to use -Tensorflow.NET= 0.15.1 -Numsharp = 0.20.5 -SharpCV = 0.5.0 -and I getting the error -The type 'NDArray' exists in both 'NumSharp.Core, Version=0.20.5.0, ' and 'NumSharp.Lite, Version=0.1.7.0, -Any thoughts? +# #412: The type 'NDArray' exists in both 'NumSharp.Core, Version=0.20.5.0, ' and 'NumSharp.Lite, Version=0.1.7.0, + +- **URL:** https://github.com/SciSharp/NumSharp/issues/412 +- **State:** OPEN +- **Author:** @sportbilly21 +- **Created:** 2020-05-27T11:43:26Z +- **Updated:** 2020-05-27T11:43:26Z + +## Description + +Hi +I am trying to use +Tensorflow.NET= 0.15.1 +Numsharp = 0.20.5 +SharpCV = 0.5.0 +and I getting the error +The type 'NDArray' exists in both 'NumSharp.Core, Version=0.20.5.0, ' and 'NumSharp.Lite, Version=0.1.7.0, +Any thoughts? diff --git a/docs/issues/issue-0413-ndarray-split.md b/docs/issues/issue-0413-ndarray-split.md index dc8c46fb..fbccc239 100644 --- a/docs/issues/issue-0413-ndarray-split.md +++ b/docs/issues/issue-0413-ndarray-split.md @@ -1,34 +1,34 @@ -# #413: NDArray Split +# #413: NDArray Split + +- **URL:** https://github.com/SciSharp/NumSharp/issues/413 +- **State:** OPEN +- **Author:** @lqdev +- **Created:** 2020-06-01T15:09:12Z +- **Updated:** 2020-06-01T15:09:12Z + +## Description + +Given the following Python code: -- **URL:** https://github.com/SciSharp/NumSharp/issues/413 -- **State:** OPEN -- **Author:** @lqdev -- **Created:** 2020-06-01T15:09:12Z -- **Updated:** 2020-06-01T15:09:12Z +```python +a = [1, 2, 3, 99, 99, 3, 2, 1] +a1, a2, a3 = np.split(a, [3, 5]) +print(a1, a2, a3) +``` -## Description +Translated to F#: -Given the following Python code: - -```python -a = [1, 2, 3, 99, 99, 3, 2, 1] -a1, a2, a3 = np.split(a, [3, 5]) -print(a1, a2, a3) -``` - -Translated to F#: - -```fsharp -let a = [|1;2;3;99;99;3;2;1|] -let a1,a2,a3 = np.split(a,[|3,5|]) -``` - -When trying to call `split`, I get the following error - -```text -typecheck error The field, constructor or member 'split' is not defined -``` - -Calling `split` on its own without any input arguments, also returns the same error. - -Is `split` implemented in NumSharp? +```fsharp +let a = [|1;2;3;99;99;3;2;1|] +let a1,a2,a3 = np.split(a,[|3,5|]) +``` + +When trying to call `split`, I get the following error + +```text +typecheck error The field, constructor or member 'split' is not defined +``` + +Calling `split` on its own without any input arguments, also returns the same error. + +Is `split` implemented in NumSharp? diff --git a/docs/issues/issue-0414-implementation-of-np.delete-working.md b/docs/issues/issue-0414-implementation-of-np.delete-working.md index eb9d61ae..abc69afd 100644 --- a/docs/issues/issue-0414-implementation-of-np.delete-working.md +++ b/docs/issues/issue-0414-implementation-of-np.delete-working.md @@ -1,16 +1,16 @@ -# #414: Implementation of np.delete working? +# #414: Implementation of np.delete working? + +- **URL:** https://github.com/SciSharp/NumSharp/issues/414 +- **State:** OPEN +- **Author:** @simonbuehler +- **Created:** 2020-06-16T21:50:47Z +- **Updated:** 2020-06-16T21:50:47Z + +## Description + +hi, -- **URL:** https://github.com/SciSharp/NumSharp/issues/414 -- **State:** OPEN -- **Author:** @simonbuehler -- **Created:** 2020-06-16T21:50:47Z -- **Updated:** 2020-06-16T21:50:47Z +currently the sourcode just returns null, shouldn't the commented code work? -## Description -hi, - -currently the sourcode just returns null, shouldn't the commented code work? - - -https://github.com/SciSharp/NumSharp/blob/843309e7e873bfb0bec2d6e56b3dcba4b9e723e0/src/NumSharp.Core/Manipulation/NdArray.delete.cs#L9 +https://github.com/SciSharp/NumSharp/blob/843309e7e873bfb0bec2d6e56b3dcba4b9e723e0/src/NumSharp.Core/Manipulation/NdArray.delete.cs#L9 diff --git a/docs/issues/issue-0416-how-to-make-numsharp.ndarray-from-numpy.ndarray.md b/docs/issues/issue-0416-how-to-make-numsharp.ndarray-from-numpy.ndarray.md index 0ef05784..65ffcc46 100644 --- a/docs/issues/issue-0416-how-to-make-numsharp.ndarray-from-numpy.ndarray.md +++ b/docs/issues/issue-0416-how-to-make-numsharp.ndarray-from-numpy.ndarray.md @@ -1,28 +1,28 @@ -# #416: how to make NumSharp.NDArray from Numpy.NDarray? +# #416: how to make NumSharp.NDArray from Numpy.NDarray? + +- **URL:** https://github.com/SciSharp/NumSharp/issues/416 +- **State:** OPEN +- **Author:** @djagatiya +- **Created:** 2020-07-06T13:45:49Z +- **Updated:** 2020-07-07T05:43:56Z + +## Description + +_No description provided._ + +## Comments + +### Comment 1 by @djagatiya (2020-07-07T05:43:56Z) + +I found a solution, but is this the right way to do it? -- **URL:** https://github.com/SciSharp/NumSharp/issues/416 -- **State:** OPEN -- **Author:** @djagatiya -- **Created:** 2020-07-06T13:45:49Z -- **Updated:** 2020-07-07T05:43:56Z - -## Description - -_No description provided._ - -## Comments - -### Comment 1 by @djagatiya (2020-07-07T05:43:56Z) - -I found a solution, but is this the right way to do it? - -``` -Numpy.NDarray numpyArray = Numpy.np.random.randn(224,224,3); -byte[] v = numpyArray.GetData(); -fixed (byte* packet = v) -{ - var block = new UnmanagedMemoryBlock(packet, v.Length); - var storage = new UnmanagedStorage(new ArraySlice(block), numpyArray.shape.Dimensions); - NumSharp.NDArray numSharpArray = new NumSharp.NDArray(storage); -} ``` +Numpy.NDarray numpyArray = Numpy.np.random.randn(224,224,3); +byte[] v = numpyArray.GetData(); +fixed (byte* packet = v) +{ + var block = new UnmanagedMemoryBlock(packet, v.Length); + var storage = new UnmanagedStorage(new ArraySlice(block), numpyArray.shape.Dimensions); + NumSharp.NDArray numSharpArray = new NumSharp.NDArray(storage); +} +``` diff --git a/docs/issues/issue-0418-help-me.md b/docs/issues/issue-0418-help-me.md index e866765f..ce63a82e 100644 --- a/docs/issues/issue-0418-help-me.md +++ b/docs/issues/issue-0418-help-me.md @@ -1,26 +1,26 @@ -# #418: help me +# #418: help me + +- **URL:** https://github.com/SciSharp/NumSharp/issues/418 +- **State:** OPEN +- **Author:** @mak27arr +- **Created:** 2020-08-01T17:11:03Z +- **Updated:** 2020-08-02T00:52:38Z +- **Assignees:** @Nucs + +## Description + +what im do wrong np.meshgrid return only one NDArray, second always null -- **URL:** https://github.com/SciSharp/NumSharp/issues/418 -- **State:** OPEN -- **Author:** @mak27arr -- **Created:** 2020-08-01T17:11:03Z -- **Updated:** 2020-08-02T00:52:38Z -- **Assignees:** @Nucs - -## Description - -what im do wrong np.meshgrid return only one NDArray, second always null - -(scales, ratios) = np.meshgrid(np.array(scales), np.array(ratios)); - scales = scales.flatten(); - ratios = ratios.flatten(); - // Enumerate heights and widths from scales and ratios - var heights = scales / np.sqrt(ratios); - var widths = scales * np.sqrt(ratios); - //Enumerate shifts in feature space - var shifts_y = np.arange(0, shape[0], anchor_stride) * feature_stride; - var shifts_x = np.arange(0, shape[1], anchor_stride) * feature_stride; - (shifts_x, shifts_y) = np.meshgrid(shifts_x, shifts_y); - // Enumerate combinations of shifts, widths, and heights - var (box_widths, box_centers_x) = np.meshgrid(widths, shifts_x); - var (box_heights, box_centers_y) = np.meshgrid(heights, shifts_y); +(scales, ratios) = np.meshgrid(np.array(scales), np.array(ratios)); + scales = scales.flatten(); + ratios = ratios.flatten(); + // Enumerate heights and widths from scales and ratios + var heights = scales / np.sqrt(ratios); + var widths = scales * np.sqrt(ratios); + //Enumerate shifts in feature space + var shifts_y = np.arange(0, shape[0], anchor_stride) * feature_stride; + var shifts_x = np.arange(0, shape[1], anchor_stride) * feature_stride; + (shifts_x, shifts_y) = np.meshgrid(shifts_x, shifts_y); + // Enumerate combinations of shifts, widths, and heights + var (box_widths, box_centers_x) = np.meshgrid(widths, shifts_x); + var (box_heights, box_centers_y) = np.meshgrid(heights, shifts_y); diff --git a/docs/issues/issue-0421-performance.md b/docs/issues/issue-0421-performance.md index 38180410..1a1e0b39 100644 --- a/docs/issues/issue-0421-performance.md +++ b/docs/issues/issue-0421-performance.md @@ -1,86 +1,86 @@ -# #421: Performance +# #421: Performance + +- **URL:** https://github.com/SciSharp/NumSharp/issues/421 +- **State:** OPEN +- **Author:** @mishun +- **Created:** 2020-08-16T01:11:02Z +- **Updated:** 2020-08-17T03:15:52Z + +## Description + +Hi! +I just tried to do some basic computational geometry with NumSharp and compare it with naive implementation like that: +```F# +open System +open System.Diagnostics +open System.Numerics +open NumSharp -- **URL:** https://github.com/SciSharp/NumSharp/issues/421 -- **State:** OPEN -- **Author:** @mishun -- **Created:** 2020-08-16T01:11:02Z -- **Updated:** 2020-08-17T03:15:52Z +[] +type Line2f = { + Normal : Vector2 + Offset : single +} -## Description +let residualsNaive (points : ReadOnlySpan, line : Line2f) = + let residuals = Array.create points.Length 0.0f + for i in 0 .. points.Length - 1 do + residuals.[i] <- abs (Vector2.Dot(line.Normal, points.[i]) + line.Offset) + residuals -Hi! -I just tried to do some basic computational geometry with NumSharp and compare it with naive implementation like that: -```F# -open System -open System.Diagnostics -open System.Numerics -open NumSharp - -[] -type Line2f = { - Normal : Vector2 - Offset : single -} - -let residualsNaive (points : ReadOnlySpan, line : Line2f) = - let residuals = Array.create points.Length 0.0f - for i in 0 .. points.Length - 1 do - residuals.[i] <- abs (Vector2.Dot(line.Normal, points.[i]) + line.Offset) - residuals - - -let residuals (points : NDArray, line : Line2f) = - let l = np.array(line.Normal.X, line.Normal.Y) - let signed = np.dot(&points, &l) + line.Offset - np.abs &signed - - -[] -let main argv = - let n = 10000000 - - let rand = Random () - let points = Array.init n (fun _ -> Vector2 (single (rand.NextDouble ()), single (rand.NextDouble ()))) - let line = - let a = Math.PI * rand.NextDouble () - { Normal = Vector2 (single (cos a), single (sin a)) - Offset = single (rand.NextDouble ()) - } - - let swNaive = Stopwatch.StartNew () - let res1 = residualsNaive (ReadOnlySpan points, line) - swNaive.Stop () - - let pointsArray = np.array([| for p in points do yield p.X ; yield p.Y |]).reshape(n, 2) - - let swNumSharp = Stopwatch.StartNew () - let res2 = residuals (pointsArray, line) - swNumSharp.Stop () - - printfn "Naive: %A\nNumSharp: %A\n\n" swNaive.Elapsed swNumSharp.Elapsed - printfn "Result:\n%A vs %A" (Array.sum res1) (np.sum (&res2)) - - 0 -``` -and got: -``` -$ dotnet run -c release -Naive: 00:00:00.0762210 -NumSharp: 00:00:09.7929785 -``` -Maybe I'm doing something very-very wrong, but 2-something orders of magnitude difference looks a bit too much even if there are just managed loops inside NumSharp's functions. - -Tested with -``` -) -``` -## Comments +let residuals (points : NDArray, line : Line2f) = + let l = np.array(line.Normal.X, line.Normal.Y) + let signed = np.dot(&points, &l) + line.Offset + np.abs &signed + + +[] +let main argv = + let n = 10000000 + + let rand = Random () + let points = Array.init n (fun _ -> Vector2 (single (rand.NextDouble ()), single (rand.NextDouble ()))) + let line = + let a = Math.PI * rand.NextDouble () + { Normal = Vector2 (single (cos a), single (sin a)) + Offset = single (rand.NextDouble ()) + } + + let swNaive = Stopwatch.StartNew () + let res1 = residualsNaive (ReadOnlySpan points, line) + swNaive.Stop () -### Comment 1 by @Oceania2018 (2020-08-16T12:49:32Z) + let pointsArray = np.array([| for p in points do yield p.X ; yield p.Y |]).reshape(n, 2) -Can you try in Tensorflow.net preview3? + let swNumSharp = Stopwatch.StartNew () + let res2 = residuals (pointsArray, line) + swNumSharp.Stop () -### Comment 2 by @mishun (2020-08-17T03:15:52Z) + printfn "Naive: %A\nNumSharp: %A\n\n" swNaive.Elapsed swNumSharp.Elapsed + printfn "Result:\n%A vs %A" (Array.sum res1) (np.sum (&res2)) -You mean use NumSharp that is installed with Tensorflow.NET 0.20.0-preview3 nuget package? Runtime looks roughly the same except np.sum is now throwing an exception. + 0 +``` +and got: +``` +$ dotnet run -c release +Naive: 00:00:00.0762210 +NumSharp: 00:00:09.7929785 +``` +Maybe I'm doing something very-very wrong, but 2-something orders of magnitude difference looks a bit too much even if there are just managed loops inside NumSharp's functions. + +Tested with +``` +) +``` + +## Comments + +### Comment 1 by @Oceania2018 (2020-08-16T12:49:32Z) + +Can you try in Tensorflow.net preview3? + +### Comment 2 by @mishun (2020-08-17T03:15:52Z) + +You mean use NumSharp that is installed with Tensorflow.NET 0.20.0-preview3 nuget package? Runtime looks roughly the same except np.sum is now throwing an exception. diff --git a/docs/issues/issue-0422-index-of-element-with-a-condiction.md b/docs/issues/issue-0422-index-of-element-with-a-condiction.md index 647ca6b4..4e17f9e2 100644 --- a/docs/issues/issue-0422-index-of-element-with-a-condiction.md +++ b/docs/issues/issue-0422-index-of-element-with-a-condiction.md @@ -1,19 +1,19 @@ -# #422: Index of element with a condiction +# #422: Index of element with a condiction + +- **URL:** https://github.com/SciSharp/NumSharp/issues/422 +- **State:** OPEN +- **Author:** @EnricoBeltramo +- **Created:** 2020-09-11T05:45:48Z +- **Updated:** 2020-09-11T05:45:48Z + +## Description + +I'm implementing a filter on array. In python it works well, but if I try to replicate in numsharp, doesn't: -- **URL:** https://github.com/SciSharp/NumSharp/issues/422 -- **State:** OPEN -- **Author:** @EnricoBeltramo -- **Created:** 2020-09-11T05:45:48Z -- **Updated:** 2020-09-11T05:45:48Z +var threshold = 0.01 +var filter1 = XYZ1[2, Slice.All] < -threshold; +var XYZ_1_filter = XYZ1[Slice.All, filter1]; +var XYZ_2_filter = XYZ2[Slice.All, filter1]; -## Description - -I'm implementing a filter on array. In python it works well, but if I try to replicate in numsharp, doesn't: - -var threshold = 0.01 -var filter1 = XYZ1[2, Slice.All] < -threshold; -var XYZ_1_filter = XYZ1[Slice.All, filter1]; -var XYZ_2_filter = XYZ2[Slice.All, filter1]; - -In particular way, filter1 return null. -How can I do? In general, how i can find indexes that respect a particular condiction (i.e. greater than, minor than) in numsharp? +In particular way, filter1 return null. +How can I do? In general, how i can find indexes that respect a particular condiction (i.e. greater than, minor than) in numsharp? diff --git a/docs/issues/issue-0423-system.notimplementedexception-somearray-np.frombuffer-bytebuffer.toa.md b/docs/issues/issue-0423-system.notimplementedexception-somearray-np.frombuffer-bytebuffer.toa.md index 4601f00a..a3cafe83 100644 --- a/docs/issues/issue-0423-system.notimplementedexception-somearray-np.frombuffer-bytebuffer.toa.md +++ b/docs/issues/issue-0423-system.notimplementedexception-somearray-np.frombuffer-bytebuffer.toa.md @@ -1,50 +1,50 @@ -# #423: "System.NotImplementedException: '' --> someArray = np.frombuffer(byteBuffer.ToArray(), np.uint32); +# #423: "System.NotImplementedException: '' --> someArray = np.frombuffer(byteBuffer.ToArray(), np.uint32); + +- **URL:** https://github.com/SciSharp/NumSharp/issues/423 +- **State:** OPEN +- **Author:** @mehmetcanbalci-Notrino +- **Created:** 2020-10-09T16:10:25Z +- **Updated:** 2020-10-18T22:51:51Z + +## Description + +Hello, +i got this execption "System.NotImplementedException: ''" when i use this code ; +someArray = np.frombuffer(byteBuffer.ToArray(), np.uint32); -- **URL:** https://github.com/SciSharp/NumSharp/issues/423 -- **State:** OPEN -- **Author:** @mehmetcanbalci-Notrino -- **Created:** 2020-10-09T16:10:25Z -- **Updated:** 2020-10-18T22:51:51Z +if I will use np.int32, it is working as expected. + +## Comments + +### Comment 1 by @ (2020-10-18T22:51:51Z) + +Hello @mehmetcanbalci-Notrino , -## Description +You got an exception because data type "uint32" is not yet being implemented, only "int32" and "byte". -Hello, -i got this execption "System.NotImplementedException: ''" when i use this code ; -someArray = np.frombuffer(byteBuffer.ToArray(), np.uint32); - -if I will use np.int32, it is working as expected. + ```c# + public static NDArray frombuffer(byte[] bytes, Type dtype) + { -## Comments + //TODO! all types + if (dtype.Name == "Int32") + { + var size = bytes.Length / InfoOf.Size; + var ints = new int[size]; + for (var index = 0; index < size; index++) + { + ints[index] = BitConverter.ToInt32(bytes, index * InfoOf.Size); + } -### Comment 1 by @ (2020-10-18T22:51:51Z) + return new NDArray(ints); + } + else if (dtype.Name == "Byte") + { + var size = bytes.Length / InfoOf.Size; + var ints = bytes; + return new NDArray(bytes); + } -Hello @mehmetcanbalci-Notrino , - -You got an exception because data type "uint32" is not yet being implemented, only "int32" and "byte". - - ```c# - public static NDArray frombuffer(byte[] bytes, Type dtype) - { - - //TODO! all types - if (dtype.Name == "Int32") - { - var size = bytes.Length / InfoOf.Size; - var ints = new int[size]; - for (var index = 0; index < size; index++) - { - ints[index] = BitConverter.ToInt32(bytes, index * InfoOf.Size); - } - - return new NDArray(ints); - } - else if (dtype.Name == "Byte") - { - var size = bytes.Length / InfoOf.Size; - var ints = bytes; - return new NDArray(bytes); - } - - throw new NotImplementedException(""); - } -``` + throw new NotImplementedException(""); + } +``` diff --git a/docs/issues/issue-0424-the-type-or-namespace-name-numsharp-could-not-be-found-are-you-missing-a-usin.md b/docs/issues/issue-0424-the-type-or-namespace-name-numsharp-could-not-be-found-are-you-missing-a-usin.md index 875ae50f..e6591093 100644 --- a/docs/issues/issue-0424-the-type-or-namespace-name-numsharp-could-not-be-found-are-you-missing-a-usin.md +++ b/docs/issues/issue-0424-the-type-or-namespace-name-numsharp-could-not-be-found-are-you-missing-a-usin.md @@ -1,36 +1,36 @@ -# #424: The type or namespace name 'NumSharp' could not be found (are you missing a using directive or an assembly reference?) [Assembly-CSharp]csharp(CS0246) - -- **URL:** https://github.com/SciSharp/NumSharp/issues/424 -- **State:** OPEN -- **Author:** @rcffc -- **Created:** 2020-10-15T15:47:16Z -- **Updated:** 2020-10-19T21:52:32Z - -## Description - -I am using VSCode and have tried installing Numsharp using NuGet Gallery and Nuget Package Manager. - -But still I am getting this error in my Unity project: -`The type or namespace name 'NumSharp' could not be found (are you missing a using directive or an assembly reference?) [Assembly-CSharp]csharp(CS0246)` - -Any cues? - -## Comments - -### Comment 1 by @rcffc (2020-10-15T15:48:24Z) - -It is also included in Assembly-CSharp.csproj: - `` - -### Comment 2 by @ (2020-10-19T21:52:31Z) - -Hello @rcffc, - -1) Have you tried to restart VSCode? - -2) If your project is using .NET Core, the CLI tool allows you to easily install NuGet packages from VSCode. - - `dotnet add package NumSharp` - - After the command completes, look at the project file (*.csproj) to make sure the package was installed. - +# #424: The type or namespace name 'NumSharp' could not be found (are you missing a using directive or an assembly reference?) [Assembly-CSharp]csharp(CS0246) + +- **URL:** https://github.com/SciSharp/NumSharp/issues/424 +- **State:** OPEN +- **Author:** @rcffc +- **Created:** 2020-10-15T15:47:16Z +- **Updated:** 2020-10-19T21:52:32Z + +## Description + +I am using VSCode and have tried installing Numsharp using NuGet Gallery and Nuget Package Manager. + +But still I am getting this error in my Unity project: +`The type or namespace name 'NumSharp' could not be found (are you missing a using directive or an assembly reference?) [Assembly-CSharp]csharp(CS0246)` + +Any cues? + +## Comments + +### Comment 1 by @rcffc (2020-10-15T15:48:24Z) + +It is also included in Assembly-CSharp.csproj: + `` + +### Comment 2 by @ (2020-10-19T21:52:31Z) + +Hello @rcffc, + +1) Have you tried to restart VSCode? + +2) If your project is using .NET Core, the CLI tool allows you to easily install NuGet packages from VSCode. + + `dotnet add package NumSharp` + + After the command completes, look at the project file (*.csproj) to make sure the package was installed. + diff --git a/docs/issues/issue-0426-arctan2-returning-incorrect-value.md b/docs/issues/issue-0426-arctan2-returning-incorrect-value.md index f59e442f..a2642878 100644 --- a/docs/issues/issue-0426-arctan2-returning-incorrect-value.md +++ b/docs/issues/issue-0426-arctan2-returning-incorrect-value.md @@ -1,48 +1,48 @@ -# #426: arctan2() returning incorrect value - -- **URL:** https://github.com/SciSharp/NumSharp/issues/426 -- **State:** OPEN -- **Author:** @RoseberryPi -- **Created:** 2020-10-25T17:14:27Z -- **Updated:** 2020-10-29T22:22:09Z - -## Description - -So I'm using numsharp -`np.arctan2(np.array(-0.0012562886517319706), np.array(-0.7499033624114052))` - -I get the wrong value, approximately, `-4.33e-5` - -using numpy.net and C#'s Math library -`np.arctan2(np.array(-0.0012562886517319706), np.array(-0.7499033624114052))` -`Math.Atan2(-0.0012562886517319706, -0.7499033624114052)` - -I get `-3.1399`, which is the correct value.. Am I just being dumb and doing something wrong or is NumSharp not actually calculating the correct value? - -furthmore, `np.arctan2(1,1)` is 90deg according to numsharp. Should be 45. -`np.arctan2(1,-1)` is also 90deg.... - -I'm using version v0.20.5 - -## Comments - -### Comment 1 by @ (2020-10-29T22:22:09Z) - -Hello @RoseberryPi, - -You are right, looking at code I don't understand the type casting done to (byte*) instead of (double*). -There must be an explanation. - -```csharp -case NPTypeCode.Double: -{ - var out_addr = (double*)out_y.Address; - var out_addr_x = (byte*)out_x.Address; - Parallel.For(0, len, i => *(out_addr) = Converts.ToDouble(Math.Atan2(*(out_addr) + i, *(out_addr_x) + i))); - return out_y; -} -``` -I tried casting to (double*) and it returns the expected value, 3.13991738776297 - - +# #426: arctan2() returning incorrect value + +- **URL:** https://github.com/SciSharp/NumSharp/issues/426 +- **State:** OPEN +- **Author:** @RoseberryPi +- **Created:** 2020-10-25T17:14:27Z +- **Updated:** 2020-10-29T22:22:09Z + +## Description + +So I'm using numsharp +`np.arctan2(np.array(-0.0012562886517319706), np.array(-0.7499033624114052))` +I get the wrong value, approximately, `-4.33e-5` + +using numpy.net and C#'s Math library +`np.arctan2(np.array(-0.0012562886517319706), np.array(-0.7499033624114052))` +`Math.Atan2(-0.0012562886517319706, -0.7499033624114052)` + +I get `-3.1399`, which is the correct value.. Am I just being dumb and doing something wrong or is NumSharp not actually calculating the correct value? + +furthmore, `np.arctan2(1,1)` is 90deg according to numsharp. Should be 45. +`np.arctan2(1,-1)` is also 90deg.... + +I'm using version v0.20.5 + +## Comments + +### Comment 1 by @ (2020-10-29T22:22:09Z) + +Hello @RoseberryPi, + +You are right, looking at code I don't understand the type casting done to (byte*) instead of (double*). +There must be an explanation. + +```csharp +case NPTypeCode.Double: +{ + var out_addr = (double*)out_y.Address; + var out_addr_x = (byte*)out_x.Address; + Parallel.For(0, len, i => *(out_addr) = Converts.ToDouble(Math.Atan2(*(out_addr) + i, *(out_addr_x) + i))); + return out_y; +} +``` +I tried casting to (double*) and it returns the expected value, 3.13991738776297 + + + diff --git a/docs/issues/issue-0427-performance-on-np.matmul.md b/docs/issues/issue-0427-performance-on-np.matmul.md index c7112653..7cf7dd58 100644 --- a/docs/issues/issue-0427-performance-on-np.matmul.md +++ b/docs/issues/issue-0427-performance-on-np.matmul.md @@ -1,44 +1,44 @@ -# #427: Performance on np.matmul - -- **URL:** https://github.com/SciSharp/NumSharp/issues/427 -- **State:** OPEN -- **Author:** @Banyc -- **Created:** 2020-10-31T12:26:03Z -- **Updated:** 2020-10-31T14:10:34Z - -## Description - -The shape of `x` is [200, 1000], of `w` is [1000, 500], and of `b` is [500] - -`b` is filled with zeros, `x` and `w` are random float64/double. - -Example code of NumSharp: - -```csharp -var out = np.matmul(x, w) + b; -``` - -... takes 3-4 seconds. - -Example code of numpy: - -```python -out = x @ w + b -``` - -... finishes immediately. - - -## Comments - -### Comment 1 by @Oceania2018 (2020-10-31T13:53:38Z) - -@Banyc Can you test it in `TensorFlow.NET` eager mode? - -### Comment 2 by @Banyc (2020-10-31T14:07:13Z) - -I use only this package to implement neural network layers from the stretch, without using other packages like `Tensorflow.NET`. - -### Comment 3 by @Oceania2018 (2020-10-31T14:10:34Z) - -It will have performance issue. Should use other more mature package. +# #427: Performance on np.matmul + +- **URL:** https://github.com/SciSharp/NumSharp/issues/427 +- **State:** OPEN +- **Author:** @Banyc +- **Created:** 2020-10-31T12:26:03Z +- **Updated:** 2020-10-31T14:10:34Z + +## Description + +The shape of `x` is [200, 1000], of `w` is [1000, 500], and of `b` is [500] + +`b` is filled with zeros, `x` and `w` are random float64/double. + +Example code of NumSharp: + +```csharp +var out = np.matmul(x, w) + b; +``` + +... takes 3-4 seconds. + +Example code of numpy: + +```python +out = x @ w + b +``` + +... finishes immediately. + + +## Comments + +### Comment 1 by @Oceania2018 (2020-10-31T13:53:38Z) + +@Banyc Can you test it in `TensorFlow.NET` eager mode? + +### Comment 2 by @Banyc (2020-10-31T14:07:13Z) + +I use only this package to implement neural network layers from the stretch, without using other packages like `Tensorflow.NET`. + +### Comment 3 by @Oceania2018 (2020-10-31T14:10:34Z) + +It will have performance issue. Should use other more mature package. diff --git a/docs/issues/issue-0428-typo-in-ndarray.tomuliarray-method-name.md b/docs/issues/issue-0428-typo-in-ndarray.tomuliarray-method-name.md index e3521f06..097b5b1a 100644 --- a/docs/issues/issue-0428-typo-in-ndarray.tomuliarray-method-name.md +++ b/docs/issues/issue-0428-typo-in-ndarray.tomuliarray-method-name.md @@ -1,13 +1,13 @@ -# #428: Typo in NDArray.ToMuliArray method name +# #428: Typo in NDArray.ToMuliArray method name + +- **URL:** https://github.com/SciSharp/NumSharp/issues/428 +- **State:** OPEN +- **Author:** @jpmn +- **Created:** 2020-11-11T20:09:52Z +- **Updated:** 2020-11-11T20:09:52Z + +## Description + +According to the filename `NumSharp.Core/Casting/NdArrayToMultiDimArray.cs`, I think it should be `NDArray.ToMultiArray` -- **URL:** https://github.com/SciSharp/NumSharp/issues/428 -- **State:** OPEN -- **Author:** @jpmn -- **Created:** 2020-11-11T20:09:52Z -- **Updated:** 2020-11-11T20:09:52Z - -## Description - -According to the filename `NumSharp.Core/Casting/NdArrayToMultiDimArray.cs`, I think it should be `NDArray.ToMultiArray` - -https://github.com/SciSharp/NumSharp/blob/843309e7e873bfb0bec2d6e56b3dcba4b9e723e0/src/NumSharp.Core/Casting/NdArrayToMultiDimArray.cs#L31 +https://github.com/SciSharp/NumSharp/blob/843309e7e873bfb0bec2d6e56b3dcba4b9e723e0/src/NumSharp.Core/Casting/NdArrayToMultiDimArray.cs#L31 diff --git a/docs/issues/issue-0430-numsharp.backends.unmanaged.unmanagedmemoryblock1-fails-on-mono-on-linux.md b/docs/issues/issue-0430-numsharp.backends.unmanaged.unmanagedmemoryblock1-fails-on-mono-on-linux.md index 7c628298..7944cdc9 100644 --- a/docs/issues/issue-0430-numsharp.backends.unmanaged.unmanagedmemoryblock1-fails-on-mono-on-linux.md +++ b/docs/issues/issue-0430-numsharp.backends.unmanaged.unmanagedmemoryblock1-fails-on-mono-on-linux.md @@ -1,33 +1,33 @@ -# #430: NumSharp.Backends.Unmanaged.UnmanagedMemoryBlock`1 fails on Mono on Linux +# #430: NumSharp.Backends.Unmanaged.UnmanagedMemoryBlock`1 fails on Mono on Linux + +- **URL:** https://github.com/SciSharp/NumSharp/issues/430 +- **State:** OPEN +- **Author:** @kgoderis +- **Created:** 2020-11-15T18:22:46Z +- **Updated:** 2020-11-15T18:22:46Z + +## Description + +Mono 5.12.0.301 +Linux 4.19.76 -- **URL:** https://github.com/SciSharp/NumSharp/issues/430 -- **State:** OPEN -- **Author:** @kgoderis -- **Created:** 2020-11-15T18:22:46Z -- **Updated:** 2020-11-15T18:22:46Z +Attempting the "Hello World" Tensortflow.NET example in a docker environment running Mono yields the following error. Exactly the same code on Mono 6.12.0.93 on Mac OS X however does run flawlessly -## Description +2020-11-15 17:53:41.843832: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN)to use the following CPU instructions in performance-critical operations: AVX2 FMA +To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags. +2020-11-15 17:53:41.873442: I tensorflow/core/platform/profile_utils/cpu_utils.cc:104] CPU Frequency: 2712000000 Hz +2020-11-15 17:53:41.874170: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x7fc874d557a0 initialized for platform Host (this does not guarantee that XLA will be used). Devices: +2020-11-15 17:53:41.874230: I tensorflow/compiler/xla/service/service.cc:176] StreamExecutor device (0): Host, Default Version +Stacktrace: -Mono 5.12.0.301 -Linux 4.19.76 - -Attempting the "Hello World" Tensortflow.NET example in a docker environment running Mono yields the following error. Exactly the same code on Mono 6.12.0.93 on Mac OS X however does run flawlessly - -2020-11-15 17:53:41.843832: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN)to use the following CPU instructions in performance-critical operations: AVX2 FMA -To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags. -2020-11-15 17:53:41.873442: I tensorflow/core/platform/profile_utils/cpu_utils.cc:104] CPU Frequency: 2712000000 Hz -2020-11-15 17:53:41.874170: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x7fc874d557a0 initialized for platform Host (this does not guarantee that XLA will be used). Devices: -2020-11-15 17:53:41.874230: I tensorflow/compiler/xla/service/service.cc:176] StreamExecutor device (0): Host, Default Version -Stacktrace: - - at <0xffffffff> -* Assertion at method-to-ir.c:7352, condition `!sig->has_type_parameters' not met - - at NumSharp.Backends.Unmanaged.UnmanagedMemoryBlock`1.FromArray (byte[],bool) [0x00037] in <6d1fbec37f814ff9b52dec21dc0ebd1a>:0 - at NumSharp.Backends.Unmanaged.ArraySlice.FromArray (byte[],bool) [0x00000] in <6d1fbec37f814ff9b52dec21dc0ebd1a>:0 - at NumSharp.np.array (byte[]) [0x00000] in <6d1fbec37f814ff9b52dec21dc0ebd1a>:0 - at Tensorflow.Tensor.GetNDArray (Tensorflow.TF_DataType) [0x00041] in :0 - at Tensorflow.Tensor.numpy () [0x00007] in :0 - at Tensorflow.tensor_util.to_numpy_string (Tensorflow.Tensor) [0x00034] in :0 - at Tensorflow.Eager.EagerTensor.ToString () [0x00016] in :0 + at <0xffffffff> +* Assertion at method-to-ir.c:7352, condition `!sig->has_type_parameters' not met + at NumSharp.Backends.Unmanaged.UnmanagedMemoryBlock`1.FromArray (byte[],bool) [0x00037] in <6d1fbec37f814ff9b52dec21dc0ebd1a>:0 + at NumSharp.Backends.Unmanaged.ArraySlice.FromArray (byte[],bool) [0x00000] in <6d1fbec37f814ff9b52dec21dc0ebd1a>:0 + at NumSharp.np.array (byte[]) [0x00000] in <6d1fbec37f814ff9b52dec21dc0ebd1a>:0 + at Tensorflow.Tensor.GetNDArray (Tensorflow.TF_DataType) [0x00041] in :0 + at Tensorflow.Tensor.numpy () [0x00007] in :0 + at Tensorflow.tensor_util.to_numpy_string (Tensorflow.Tensor) [0x00034] in :0 + at Tensorflow.Eager.EagerTensor.ToString () [0x00016] in :0 + diff --git a/docs/issues/issue-0433-ndarray-exists-in-both-numsharp.core-version-0.20.5.0-and-numsharp.lite-versio.md b/docs/issues/issue-0433-ndarray-exists-in-both-numsharp.core-version-0.20.5.0-and-numsharp.lite-versio.md index 69e6a3c1..810b585c 100644 --- a/docs/issues/issue-0433-ndarray-exists-in-both-numsharp.core-version-0.20.5.0-and-numsharp.lite-versio.md +++ b/docs/issues/issue-0433-ndarray-exists-in-both-numsharp.core-version-0.20.5.0-and-numsharp.lite-versio.md @@ -1,58 +1,58 @@ -# #433: NDArray exists in both NumSharp.Core, Version=0.20.5.0 and NumSharp.Lite, Version=0.1.9.0 - -- **URL:** https://github.com/SciSharp/NumSharp/issues/433 -- **State:** OPEN -- **Author:** @gscheck -- **Created:** 2020-12-09T16:50:56Z -- **Updated:** 2020-12-09T20:14:45Z - -## Description - -I get the following error when trying to compile an example: - -Severity Code Description Project File Line Suppression State -Error CS0433 The type 'NDArray' exists in both 'NumSharp.Core, Version=0.20.5.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' and 'NumSharp.Lite, Version=0.1.9.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' Tensorflow1 I:\Operations\Test Engineering\Test Eng\Software Development\AOI\Tensorflow1\Tensorflow1\Form1.cs 47 Active - - -I am only using TensorFlow.NET and NumSharp libraries. - -See screen shots below: - -![image](https://user-images.githubusercontent.com/32424716/101659915-6c363b00-39fb-11eb-8c40-e86669bd195c.png) - -![image](https://user-images.githubusercontent.com/32424716/101659977-7eb07480-39fb-11eb-8586-8ffa642f1059.png) - - - -## Comments - -### Comment 1 by @Oceania2018 (2020-12-09T17:59:09Z) - -Remove NumSharp reference, just reference TensorFlow.NET project. It will include NumSharp automatically. - -### Comment 2 by @gscheck (2020-12-09T18:29:12Z) - -If I remove the NumSharp reference, I get the following error. - -Severity Code Description Project File Line Suppression State -Error CS0246 The type or namespace name 'NDArray' could not be found (are you missing a using directive or an assembly reference?) Tensorflow1 I:\Operations\Test Engineering\Test Eng\Software Development\AOI\Tensorflow1\Tensorflow1\Form1.cs 46 Active - - -![image](https://user-images.githubusercontent.com/32424716/101671436-5891d100-3a09-11eb-8217-918b6444a1e0.png) - -![image](https://user-images.githubusercontent.com/32424716/101671376-431ca700-3a09-11eb-930c-5fb6c5e4dfa7.png) - - - - -### Comment 3 by @Oceania2018 (2020-12-09T20:14:35Z) - -Remove project reference means remove it from package. -![image](https://user-images.githubusercontent.com/1705364/101682026-ae29a600-3a28-11eb-8fad-6b9496827314.png) - -You still need: -```csharp -using Numsharp; -``` - -The easiest step is just follow this [sample project](https://github.com/SciSharp/SciSharp-Stack-Examples). +# #433: NDArray exists in both NumSharp.Core, Version=0.20.5.0 and NumSharp.Lite, Version=0.1.9.0 + +- **URL:** https://github.com/SciSharp/NumSharp/issues/433 +- **State:** OPEN +- **Author:** @gscheck +- **Created:** 2020-12-09T16:50:56Z +- **Updated:** 2020-12-09T20:14:45Z + +## Description + +I get the following error when trying to compile an example: + +Severity Code Description Project File Line Suppression State +Error CS0433 The type 'NDArray' exists in both 'NumSharp.Core, Version=0.20.5.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' and 'NumSharp.Lite, Version=0.1.9.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' Tensorflow1 I:\Operations\Test Engineering\Test Eng\Software Development\AOI\Tensorflow1\Tensorflow1\Form1.cs 47 Active + + +I am only using TensorFlow.NET and NumSharp libraries. + +See screen shots below: + +![image](https://user-images.githubusercontent.com/32424716/101659915-6c363b00-39fb-11eb-8c40-e86669bd195c.png) + +![image](https://user-images.githubusercontent.com/32424716/101659977-7eb07480-39fb-11eb-8586-8ffa642f1059.png) + + + +## Comments + +### Comment 1 by @Oceania2018 (2020-12-09T17:59:09Z) + +Remove NumSharp reference, just reference TensorFlow.NET project. It will include NumSharp automatically. + +### Comment 2 by @gscheck (2020-12-09T18:29:12Z) + +If I remove the NumSharp reference, I get the following error. + +Severity Code Description Project File Line Suppression State +Error CS0246 The type or namespace name 'NDArray' could not be found (are you missing a using directive or an assembly reference?) Tensorflow1 I:\Operations\Test Engineering\Test Eng\Software Development\AOI\Tensorflow1\Tensorflow1\Form1.cs 46 Active + + +![image](https://user-images.githubusercontent.com/32424716/101671436-5891d100-3a09-11eb-8217-918b6444a1e0.png) + +![image](https://user-images.githubusercontent.com/32424716/101671376-431ca700-3a09-11eb-930c-5fb6c5e4dfa7.png) + + + + +### Comment 3 by @Oceania2018 (2020-12-09T20:14:35Z) + +Remove project reference means remove it from package. +![image](https://user-images.githubusercontent.com/1705364/101682026-ae29a600-3a28-11eb-8fad-6b9496827314.png) + +You still need: +```csharp +using Numsharp; +``` + +The easiest step is just follow this [sample project](https://github.com/SciSharp/SciSharp-Stack-Examples). diff --git a/docs/issues/issue-0434-accessviolationexception-when-selecting-indexes-using-ndarray-ndarray-and-setti.md b/docs/issues/issue-0434-accessviolationexception-when-selecting-indexes-using-ndarray-ndarray-and-setti.md index 33c411c9..10196348 100644 --- a/docs/issues/issue-0434-accessviolationexception-when-selecting-indexes-using-ndarray-ndarray-and-setti.md +++ b/docs/issues/issue-0434-accessviolationexception-when-selecting-indexes-using-ndarray-ndarray-and-setti.md @@ -1,39 +1,39 @@ -# #434: AccessViolationException when selecting indexes using ndarray[ndarray] and setting a scalar value - -- **URL:** https://github.com/SciSharp/NumSharp/issues/434 -- **State:** OPEN -- **Author:** @lijianxin520 -- **Created:** 2020-12-31T02:30:16Z -- **Updated:** 2021-04-21T04:50:55Z -- **Labels:** bug - -## Description - -Attempted to read or write protected memory. This is often an indication that other memory is corrupt. -![2020-12-30_230218](https://user-images.githubusercontent.com/47262889/103391183-013bd800-4b53-11eb-9f76-0ad77b978ae2.png) - - -## Comments - -### Comment 1 by @rikkitook (2021-04-01T12:43:13Z) - -To my experience, problems like these can be avoided if you do not access an instance of ndarray from different threads or tasks. If it is still necessary, try copying ndarray to float[], pass it to your method and then copy to new ndarray. -Cheers! - -### Comment 2 by @lijianxin520 (2021-04-13T06:43:06Z) - -I'm single-threaded, so I shouldn't have any problems with multithreading - -### Comment 3 by @Nucs (2021-04-13T11:19:50Z) - -To my understanding - `AccessViolationException` usually occurs if you somehow lost reference to your `NDArray`. -`NDArray` only frees allocated memory when `IDisposable` is triggered by the garbage collector when there are no longer any references to it. -In addition, zero-copied `NDArray`s from any operation still hold a reference to base memory which should prevent deallocation. - -Please provide here a reproducing unit test/piece of code and I'll gladly investigate. - -### Comment 4 by @lijianxin520 (2021-04-15T06:40:57Z) - -这个是我测试的时候异常的内容, -![image](https://user-images.githubusercontent.com/47262889/114825071-521cc700-9df8-11eb-9125-08b91b5971fd.png) -当我对一个数组执行批处理操作时,我看到的结果是这个问题. +# #434: AccessViolationException when selecting indexes using ndarray[ndarray] and setting a scalar value + +- **URL:** https://github.com/SciSharp/NumSharp/issues/434 +- **State:** OPEN +- **Author:** @lijianxin520 +- **Created:** 2020-12-31T02:30:16Z +- **Updated:** 2021-04-21T04:50:55Z +- **Labels:** bug + +## Description + +Attempted to read or write protected memory. This is often an indication that other memory is corrupt. +![2020-12-30_230218](https://user-images.githubusercontent.com/47262889/103391183-013bd800-4b53-11eb-9f76-0ad77b978ae2.png) + + +## Comments + +### Comment 1 by @rikkitook (2021-04-01T12:43:13Z) + +To my experience, problems like these can be avoided if you do not access an instance of ndarray from different threads or tasks. If it is still necessary, try copying ndarray to float[], pass it to your method and then copy to new ndarray. +Cheers! + +### Comment 2 by @lijianxin520 (2021-04-13T06:43:06Z) + +I'm single-threaded, so I shouldn't have any problems with multithreading + +### Comment 3 by @Nucs (2021-04-13T11:19:50Z) + +To my understanding - `AccessViolationException` usually occurs if you somehow lost reference to your `NDArray`. +`NDArray` only frees allocated memory when `IDisposable` is triggered by the garbage collector when there are no longer any references to it. +In addition, zero-copied `NDArray`s from any operation still hold a reference to base memory which should prevent deallocation. + +Please provide here a reproducing unit test/piece of code and I'll gladly investigate. + +### Comment 4 by @lijianxin520 (2021-04-15T06:40:57Z) + +这个是我测试的时候异常的内容, +![image](https://user-images.githubusercontent.com/47262889/114825071-521cc700-9df8-11eb-9125-08b91b5971fd.png) +当我对一个数组执行批处理操作时,我看到的结果是这个问题. diff --git a/docs/issues/issue-0435-complex-number-support.md b/docs/issues/issue-0435-complex-number-support.md index 71bb858e..f6133318 100644 --- a/docs/issues/issue-0435-complex-number-support.md +++ b/docs/issues/issue-0435-complex-number-support.md @@ -1,43 +1,43 @@ -# #435: Complex number support? - -- **URL:** https://github.com/SciSharp/NumSharp/issues/435 -- **State:** OPEN -- **Author:** @cgranade -- **Created:** 2021-01-07T22:43:31Z -- **Updated:** 2023-08-19T14:29:33Z - -## Description - -When attempting to create a new `NDArray` of complex numbers, I get an exception in the `Allocate` method at https://github.com/SciSharp/NumSharp/blob/00d8700b00e815f321238536e0d6b4dbc9af8d6a/src/NumSharp.Core/Backends/Unmanaged/ArraySlice.cs#L387: - -![image](https://user-images.githubusercontent.com/31516/103953204-89435400-50f6-11eb-9ec7-13e522da1445.png) - -Are complex numbers supported as the dtype of `NDArray` objects, and if so, how do I allocate them? Thanks for the help, and for the awesome project! - -## Comments - -### Comment 1 by @dcuccia (2021-06-29T00:48:34Z) - -+1. Just got to the end of a port, and realized Complex is not supported. Are there plans for this? - -### Comment 2 by @LetGo (2022-03-10T06:33:07Z) - -+1. Just got to the end of a port, and realized Complex is not supported. Are there plans for this? - -### Comment 3 by @gsgou (2023-08-19T14:26:53Z) - -Any way to workaround this one? -UnmanagedStorage also doesnt support Complex. - -``` -System.NotSupportedException: Specified method is not supported. - at NumSharp.NPTypeCodeExtensions.AsType (NumSharp.NPTypeCode typeCode) [0x00097] in D:\SciSharp\NumSharp\src\NumSharp.Core\Backends\NPTypeCode.cs:144 - at NumSharp.Backends.UnmanagedStorage..ctor (NumSharp.NPTypeCode typeCode) [0x00014] in D:\SciSharp\NumSharp\src\NumSharp.Core\Backends\Unmanaged\UnmanagedStorage.cs:181 - at NumSharp.Backends.DefaultEngine.GetStorage (NumSharp.NPTypeCode typeCode) [0x00000] in D:\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Allocation\Default.Allocation.cs:14 - at NumSharp.NDArray..ctor (NumSharp.NPTypeCode typeCode, NumSharp.TensorEngine engine) [0x0000d] in D:\SciSharp\NumSharp\src\NumSharp.Core\Backends\NDArray.cs:102 - at NumSharp.NDArray..ctor (NumSharp.NPTypeCode typeCode) [0x00000] in D:\SciSharp\NumSharp\src\NumSharp.Core\Backends\NDArray.cs:119 - at NumSharp.NDArray..ctor (NumSharp.NPTypeCode dtype, NumSharp.Shape shape, System.Boolean fillZeros) [0x00000] in D:\SciSharp\NumSharp\src\NumSharp.Core\Backends\NDArray.cs:234 - at NumSharp.np.zeros (NumSharp.Shape shape, NumSharp.NPTypeCode typeCode) [0x0000e] in D:\SciSharp\NumSharp\src\NumSharp.Core\Creation\np.zeros.cs:54 -``` - - +# #435: Complex number support? + +- **URL:** https://github.com/SciSharp/NumSharp/issues/435 +- **State:** OPEN +- **Author:** @cgranade +- **Created:** 2021-01-07T22:43:31Z +- **Updated:** 2023-08-19T14:29:33Z + +## Description + +When attempting to create a new `NDArray` of complex numbers, I get an exception in the `Allocate` method at https://github.com/SciSharp/NumSharp/blob/00d8700b00e815f321238536e0d6b4dbc9af8d6a/src/NumSharp.Core/Backends/Unmanaged/ArraySlice.cs#L387: + +![image](https://user-images.githubusercontent.com/31516/103953204-89435400-50f6-11eb-9ec7-13e522da1445.png) + +Are complex numbers supported as the dtype of `NDArray` objects, and if so, how do I allocate them? Thanks for the help, and for the awesome project! + +## Comments + +### Comment 1 by @dcuccia (2021-06-29T00:48:34Z) + ++1. Just got to the end of a port, and realized Complex is not supported. Are there plans for this? + +### Comment 2 by @LetGo (2022-03-10T06:33:07Z) + ++1. Just got to the end of a port, and realized Complex is not supported. Are there plans for this? + +### Comment 3 by @gsgou (2023-08-19T14:26:53Z) + +Any way to workaround this one? +UnmanagedStorage also doesnt support Complex. + +``` +System.NotSupportedException: Specified method is not supported. + at NumSharp.NPTypeCodeExtensions.AsType (NumSharp.NPTypeCode typeCode) [0x00097] in D:\SciSharp\NumSharp\src\NumSharp.Core\Backends\NPTypeCode.cs:144 + at NumSharp.Backends.UnmanagedStorage..ctor (NumSharp.NPTypeCode typeCode) [0x00014] in D:\SciSharp\NumSharp\src\NumSharp.Core\Backends\Unmanaged\UnmanagedStorage.cs:181 + at NumSharp.Backends.DefaultEngine.GetStorage (NumSharp.NPTypeCode typeCode) [0x00000] in D:\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Allocation\Default.Allocation.cs:14 + at NumSharp.NDArray..ctor (NumSharp.NPTypeCode typeCode, NumSharp.TensorEngine engine) [0x0000d] in D:\SciSharp\NumSharp\src\NumSharp.Core\Backends\NDArray.cs:102 + at NumSharp.NDArray..ctor (NumSharp.NPTypeCode typeCode) [0x00000] in D:\SciSharp\NumSharp\src\NumSharp.Core\Backends\NDArray.cs:119 + at NumSharp.NDArray..ctor (NumSharp.NPTypeCode dtype, NumSharp.Shape shape, System.Boolean fillZeros) [0x00000] in D:\SciSharp\NumSharp\src\NumSharp.Core\Backends\NDArray.cs:234 + at NumSharp.np.zeros (NumSharp.Shape shape, NumSharp.NPTypeCode typeCode) [0x0000e] in D:\SciSharp\NumSharp\src\NumSharp.Core\Creation\np.zeros.cs:54 +``` + + diff --git a/docs/issues/issue-0436-np.searchsorted-error.md b/docs/issues/issue-0436-np.searchsorted-error.md index c018b3d3..e76255bb 100644 --- a/docs/issues/issue-0436-np.searchsorted-error.md +++ b/docs/issues/issue-0436-np.searchsorted-error.md @@ -1,19 +1,19 @@ -# #436: np.searchsorted error! +# #436: np.searchsorted error! + +- **URL:** https://github.com/SciSharp/NumSharp/issues/436 +- **State:** OPEN +- **Author:** @wangfeixing +- **Created:** 2021-01-12T09:20:40Z +- **Updated:** 2021-01-12T09:20:40Z + +## Description + +i use "np.searchsorted" function like the code below: + List list1 = new List() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; + List list2 = new List() { 1.1, 2.1, 3.1, 4.1, 5.1, 6.1, 7.1, 8.1, 9.1, 10.1 }; + NDArray array1 = np.array(list1.ToArray()); + NDArray array2 = np.array(list2.ToArray()); -- **URL:** https://github.com/SciSharp/NumSharp/issues/436 -- **State:** OPEN -- **Author:** @wangfeixing -- **Created:** 2021-01-12T09:20:40Z -- **Updated:** 2021-01-12T09:20:40Z + int kk = np.searchsorted(array2, 3.0); -## Description - -i use "np.searchsorted" function like the code below: - List list1 = new List() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; - List list2 = new List() { 1.1, 2.1, 3.1, 4.1, 5.1, 6.1, 7.1, 8.1, 9.1, 10.1 }; - NDArray array1 = np.array(list1.ToArray()); - NDArray array2 = np.array(list2.ToArray()); - - int kk = np.searchsorted(array2, 3.0); - -but it reports the error "System.IndexOutOfRangeException",is this a bug? +but it reports the error "System.IndexOutOfRangeException",is this a bug? diff --git a/docs/issues/issue-0437-argmin-is-not-the-same-with-numpy.md b/docs/issues/issue-0437-argmin-is-not-the-same-with-numpy.md index 831c0251..92e01bdf 100644 --- a/docs/issues/issue-0437-argmin-is-not-the-same-with-numpy.md +++ b/docs/issues/issue-0437-argmin-is-not-the-same-with-numpy.md @@ -1,13 +1,13 @@ -# #437: argmin is not the same with numpy +# #437: argmin is not the same with numpy + +- **URL:** https://github.com/SciSharp/NumSharp/issues/437 +- **State:** OPEN +- **Author:** @tomachristian +- **Created:** 2021-01-30T09:08:48Z +- **Updated:** 2021-01-30T09:08:48Z + +## Description + +https://github.com/SciSharp/NumSharp/blob/00d8700b00e815f321238536e0d6b4dbc9af8d6a/src/NumSharp.Core/Statistics/NDArray.argmin.cs#L20 -- **URL:** https://github.com/SciSharp/NumSharp/issues/437 -- **State:** OPEN -- **Author:** @tomachristian -- **Created:** 2021-01-30T09:08:48Z -- **Updated:** 2021-01-30T09:08:48Z - -## Description - -https://github.com/SciSharp/NumSharp/blob/00d8700b00e815f321238536e0d6b4dbc9af8d6a/src/NumSharp.Core/Statistics/NDArray.argmin.cs#L20 - -this does not look right because it returns int, also np.argmin does not seem to behave correctly (like its numpy counterpart) +this does not look right because it returns int, also np.argmin does not seem to behave correctly (like its numpy counterpart) diff --git a/docs/issues/issue-0438-how-to-get-the-inverse-of-a-2d-matrix.md b/docs/issues/issue-0438-how-to-get-the-inverse-of-a-2d-matrix.md index d0668ccf..33bf020d 100644 --- a/docs/issues/issue-0438-how-to-get-the-inverse-of-a-2d-matrix.md +++ b/docs/issues/issue-0438-how-to-get-the-inverse-of-a-2d-matrix.md @@ -1,13 +1,13 @@ -# #438: How to get the inverse of a 2D matrix? +# #438: How to get the inverse of a 2D matrix? + +- **URL:** https://github.com/SciSharp/NumSharp/issues/438 +- **State:** OPEN +- **Author:** @Mingrui-Yu +- **Created:** 2021-02-03T16:50:22Z +- **Updated:** 2021-02-03T16:50:22Z + +## Description + +How to get the inverse of a 2D matrix ?I find NumSharp/src/NumSharp.Core/LinearAlgebra/NdArray.Inv.cs just returns null. -- **URL:** https://github.com/SciSharp/NumSharp/issues/438 -- **State:** OPEN -- **Author:** @Mingrui-Yu -- **Created:** 2021-02-03T16:50:22Z -- **Updated:** 2021-02-03T16:50:22Z - -## Description - -How to get the inverse of a 2D matrix ?I find NumSharp/src/NumSharp.Core/LinearAlgebra/NdArray.Inv.cs just returns null. - -Thanks for your help! +Thanks for your help! diff --git a/docs/issues/issue-0439-where-is-np.where-function.md b/docs/issues/issue-0439-where-is-np.where-function.md index 95bbbe82..be5eda39 100644 --- a/docs/issues/issue-0439-where-is-np.where-function.md +++ b/docs/issues/issue-0439-where-is-np.where-function.md @@ -1,14 +1,14 @@ -# #439: Where is np.where() function ? - -- **URL:** https://github.com/SciSharp/NumSharp/issues/439 -- **State:** OPEN -- **Author:** @minhduc66532 -- **Created:** 2021-02-07T05:02:40Z -- **Updated:** 2021-04-14T11:22:27Z -- **Labels:** missing feature/s - -## Description - -The title says it all: -![image](https://user-images.githubusercontent.com/66398066/107137154-30a4e800-693c-11eb-8720-d67acfd9eead.png) - +# #439: Where is np.where() function ? + +- **URL:** https://github.com/SciSharp/NumSharp/issues/439 +- **State:** OPEN +- **Author:** @minhduc66532 +- **Created:** 2021-02-07T05:02:40Z +- **Updated:** 2021-04-14T11:22:27Z +- **Labels:** missing feature/s + +## Description + +The title says it all: +![image](https://user-images.githubusercontent.com/66398066/107137154-30a4e800-693c-11eb-8720-d67acfd9eead.png) + diff --git a/docs/issues/issue-0440-ndarray.tobitmap-has-critical-issue-with-24bpp-vertical-images.md b/docs/issues/issue-0440-ndarray.tobitmap-has-critical-issue-with-24bpp-vertical-images.md index c708cf67..c3e25f1e 100644 --- a/docs/issues/issue-0440-ndarray.tobitmap-has-critical-issue-with-24bpp-vertical-images.md +++ b/docs/issues/issue-0440-ndarray.tobitmap-has-critical-issue-with-24bpp-vertical-images.md @@ -1,30 +1,30 @@ -# #440: NDArray.ToBitmap() has critical issue with 24bpp VERTICAL images +# #440: NDArray.ToBitmap() has critical issue with 24bpp VERTICAL images + +- **URL:** https://github.com/SciSharp/NumSharp/issues/440 +- **State:** OPEN +- **Author:** @MiroslavKabat +- **Created:** 2021-02-09T00:57:34Z +- **Updated:** 2021-04-14T11:21:57Z +- **Labels:** bug + +## Description + + var arr = np.ones(1, 2, 1, 3).astype(NPTypeCode.Byte); + var bmp = arr.ToBitmap(); -- **URL:** https://github.com/SciSharp/NumSharp/issues/440 -- **State:** OPEN -- **Author:** @MiroslavKabat -- **Created:** 2021-02-09T00:57:34Z -- **Updated:** 2021-04-14T11:21:57Z -- **Labels:** bug + for (int c = 0; c < bmp.Width; c++) + { + for (int r = 0; r < bmp.Height; r++) + { + var p = bmp.GetPixel(c, r); + Console.WriteLine($"r:{r} c:{c} => ({p.R};{p.G};{p.B})"); + } + } -## Description + // return + // r: 0 c: 0 => (1; 1; 1) + // r: 1 c: 0 => (0; 1; 1) !!! - var arr = np.ones(1, 2, 1, 3).astype(NPTypeCode.Byte); - var bmp = arr.ToBitmap(); - - for (int c = 0; c < bmp.Width; c++) - { - for (int r = 0; r < bmp.Height; r++) - { - var p = bmp.GetPixel(c, r); - Console.WriteLine($"r:{r} c:{c} => ({p.R};{p.G};{p.B})"); - } - } - - // return - // r: 0 c: 0 => (1; 1; 1) - // r: 1 c: 0 => (0; 1; 1) !!! - - // instead of - // r: 0 c: 0 => (1; 1; 1) - // r: 1 c: 0 => (1; 1; 1) + // instead of + // r: 0 c: 0 => (1; 1; 1) + // r: 1 c: 0 => (1; 1; 1) diff --git a/docs/issues/issue-0443-0.3.0-from-nuget-throwing-notsupportedexception-on-negate-function-call.md b/docs/issues/issue-0443-0.3.0-from-nuget-throwing-notsupportedexception-on-negate-function-call.md index 4f165389..b4581592 100644 --- a/docs/issues/issue-0443-0.3.0-from-nuget-throwing-notsupportedexception-on-negate-function-call.md +++ b/docs/issues/issue-0443-0.3.0-from-nuget-throwing-notsupportedexception-on-negate-function-call.md @@ -1,26 +1,26 @@ -# #443: 0.3.0 from NuGet throwing NotSupportedException on negate function call +# #443: 0.3.0 from NuGet throwing NotSupportedException on negate function call + +- **URL:** https://github.com/SciSharp/NumSharp/issues/443 +- **State:** OPEN +- **Author:** @gandalfh +- **Created:** 2021-03-09T03:25:55Z +- **Updated:** 2021-04-14T11:18:02Z + +## Description + +This code behaves as expected on version 0.20.5 from NuGet (https://www.nuget.org/packages/NumSharp/) -- **URL:** https://github.com/SciSharp/NumSharp/issues/443 -- **State:** OPEN -- **Author:** @gandalfh -- **Created:** 2021-03-09T03:25:55Z -- **Updated:** 2021-04-14T11:18:02Z +`var ones = np.ones((10, 1));` +`ones.negate();` -## Description +But after upgrading to 0.3.0 a NotSupportedException is thrown: -This code behaves as expected on version 0.20.5 from NuGet (https://www.nuget.org/packages/NumSharp/) - -`var ones = np.ones((10, 1));` -`ones.negate();` - -But after upgrading to 0.3.0 a NotSupportedException is thrown: - - at NumSharp.Backends.DefaultEngine.Negate(NDArray& nd) - at NumSharp.NDArray.negate() - - -## Comments - -### Comment 1 by @Nucs (2021-04-14T11:18:01Z) - -Related to #447 + at NumSharp.Backends.DefaultEngine.Negate(NDArray& nd) + at NumSharp.NDArray.negate() + + +## Comments + +### Comment 1 by @Nucs (2021-04-14T11:18:01Z) + +Related to #447 diff --git a/docs/issues/issue-0445-how-can-provide-output-for-np.dot.md b/docs/issues/issue-0445-how-can-provide-output-for-np.dot.md index c69ab021..ee806b09 100644 --- a/docs/issues/issue-0445-how-can-provide-output-for-np.dot.md +++ b/docs/issues/issue-0445-how-can-provide-output-for-np.dot.md @@ -1,14 +1,14 @@ -# #445: How can provide output for np.dot? +# #445: How can provide output for np.dot? + +- **URL:** https://github.com/SciSharp/NumSharp/issues/445 +- **State:** OPEN +- **Author:** @bigdimboom +- **Created:** 2021-03-24T02:49:34Z +- **Updated:** 2021-04-23T11:58:36Z +- **Labels:** missing feature/s + +## Description + +I can't find the impl. of np.dot(inputA, inutB, out preallocatedArray). -- **URL:** https://github.com/SciSharp/NumSharp/issues/445 -- **State:** OPEN -- **Author:** @bigdimboom -- **Created:** 2021-03-24T02:49:34Z -- **Updated:** 2021-04-23T11:58:36Z -- **Labels:** missing feature/s - -## Description - -I can't find the impl. of np.dot(inputA, inutB, out preallocatedArray). - -Currently I am using np.dot(.....).copyTo(....). But I think it still allocates a tmp memory. +Currently I am using np.dot(.....).copyTo(....). But I think it still allocates a tmp memory. diff --git a/docs/issues/issue-0446-unable-to-use-np.dot-due-to-specified-method-unsupported-error.md b/docs/issues/issue-0446-unable-to-use-np.dot-due-to-specified-method-unsupported-error.md index 1e0837b5..6c749866 100644 --- a/docs/issues/issue-0446-unable-to-use-np.dot-due-to-specified-method-unsupported-error.md +++ b/docs/issues/issue-0446-unable-to-use-np.dot-due-to-specified-method-unsupported-error.md @@ -1,69 +1,69 @@ -# #446: Unable to use np.dot due to "Specified method unsupported" error +# #446: Unable to use np.dot due to "Specified method unsupported" error + +- **URL:** https://github.com/SciSharp/NumSharp/issues/446 +- **State:** OPEN +- **Author:** @moonlitlyra +- **Created:** 2021-03-27T17:01:11Z +- **Updated:** 2021-06-30T18:55:04Z + +## Description + +I have recently been working on a unity project involving the genetic algorithm, but have run into an error while trying to use the function np.dot(). NumSharp has been installed using the NuGet client [NuGetForUnity](https://github.com/GlitchEnzo/NuGetForUnity) -- **URL:** https://github.com/SciSharp/NumSharp/issues/446 -- **State:** OPEN -- **Author:** @moonlitlyra -- **Created:** 2021-03-27T17:01:11Z -- **Updated:** 2021-06-30T18:55:04Z +The error message is as follows: -## Description +NotSupportedException: Specified method is not supported. +NumSharp.NPTypeCodeExtensions.GetAccumulatingType (NumSharp.NPTypeCode typeCode) (at <7807b007e09c46aca587061f8867e538>:0) +NumSharp.Backends.DefaultEngine.ReduceAdd (NumSharp.NDArray& arr, System.Nullable`1[T] axis_, System.Boolean keepdims, System.Nullable`1[T] typeCode, NumSharp.NDArray out) (at <7807b007e09c46aca587061f8867e538>:0) +NumSharp.Backends.DefaultEngine.Sum (NumSharp.NDArray& nd, System.Nullable`1[T] axis, System.Nullable`1[T] typeCode, System.Boolean keepdims) (at <7807b007e09c46aca587061f8867e538>:0) +NumSharp.np.sum (NumSharp.NDArray& a, System.Int32 axis) (at <7807b007e09c46aca587061f8867e538>:0) +NumSharp.Backends.DefaultEngine.Dot (NumSharp.NDArray& left, NumSharp.NDArray& right) (at <7807b007e09c46aca587061f8867e538>:0) +NumSharp.np.dot (NumSharp.NDArray& a, NumSharp.NDArray& b) (at <7807b007e09c46aca587061f8867e538>:0) +NN.FeedForward () (at Assets/scripts/NeuralNetwork.cs:73) +Bot.FixedUpdate () (at Assets/scripts/Bot.cs:70) -I have recently been working on a unity project involving the genetic algorithm, but have run into an error while trying to use the function np.dot(). NumSharp has been installed using the NuGet client [NuGetForUnity](https://github.com/GlitchEnzo/NuGetForUnity) - -The error message is as follows: - -NotSupportedException: Specified method is not supported. -NumSharp.NPTypeCodeExtensions.GetAccumulatingType (NumSharp.NPTypeCode typeCode) (at <7807b007e09c46aca587061f8867e538>:0) -NumSharp.Backends.DefaultEngine.ReduceAdd (NumSharp.NDArray& arr, System.Nullable`1[T] axis_, System.Boolean keepdims, System.Nullable`1[T] typeCode, NumSharp.NDArray out) (at <7807b007e09c46aca587061f8867e538>:0) -NumSharp.Backends.DefaultEngine.Sum (NumSharp.NDArray& nd, System.Nullable`1[T] axis, System.Nullable`1[T] typeCode, System.Boolean keepdims) (at <7807b007e09c46aca587061f8867e538>:0) -NumSharp.np.sum (NumSharp.NDArray& a, System.Int32 axis) (at <7807b007e09c46aca587061f8867e538>:0) -NumSharp.Backends.DefaultEngine.Dot (NumSharp.NDArray& left, NumSharp.NDArray& right) (at <7807b007e09c46aca587061f8867e538>:0) -NumSharp.np.dot (NumSharp.NDArray& a, NumSharp.NDArray& b) (at <7807b007e09c46aca587061f8867e538>:0) -NN.FeedForward () (at Assets/scripts/NeuralNetwork.cs:73) -Bot.FixedUpdate () (at Assets/scripts/Bot.cs:70) - -Line 73 of the FeedForward script: - -73. `NDArray activations = np.dot(layers[i].weights, layers[i].activations);` - -Other sections of relevant code: - -47. `layer.weights = np.random.rand(3, 2);` -48. `layer.activations = np.zeros(2);` +Line 73 of the FeedForward script: -## Comments +73. `NDArray activations = np.dot(layers[i].weights, layers[i].activations);` -### Comment 1 by @Nucs (2021-04-14T11:16:39Z) +Other sections of relevant code: -Related to #447 +47. `layer.weights = np.random.rand(3, 2);` +48. `layer.activations = np.zeros(2);` + +## Comments + +### Comment 1 by @Nucs (2021-04-14T11:16:39Z) + +Related to #447 + + +### Comment 2 by @BlackholeGH (2021-06-27T10:07:04Z) + +I seem to have this same issue, in a similar context attempting to use np.dot to do a dot-product for two 1-D numpy arrays containing double values. Assuming we're not both doing something wrong, any workarounds beside calculating the dot product manually? +> System.NotSupportedException + HResult=0x80131515 + Message=Specified method is not supported. + Source=NumSharp + StackTrace: + at NumSharp.NPTypeCodeExtensions.GetAccumulatingType(NPTypeCode typeCode) + at NumSharp.Backends.DefaultEngine.sum_elementwise(NDArray arr, Nullable`1 typeCode) + at NumSharp.Backends.DefaultEngine.ReduceAdd(NDArray& arr, Nullable`1 axis_, Boolean keepdims, Nullable`1 typeCode, NDArray out) + at NumSharp.Backends.DefaultEngine.Dot(NDArray& left, NDArray& right) + + +### Comment 3 by @moonlitlyra (2021-06-30T18:55:04Z) + +> I seem to have this same issue, in a similar context attempting to use np.dot to do a dot-product for two 1-D numpy arrays containing double values. Assuming we're not both doing something wrong, any workarounds beside calculating the dot product manually? +> +> > System.NotSupportedException +> > HResult=0x80131515 +> > Message=Specified method is not supported. +> > Source=NumSharp +> > StackTrace: +> > at NumSharp.NPTypeCodeExtensions.GetAccumulatingType(NPTypeCode typeCode) +> > at NumSharp.Backends.DefaultEngine.sum_elementwise(NDArray arr, Nullable`1 typeCode) at NumSharp.Backends.DefaultEngine.ReduceAdd(NDArray& arr, Nullable`1 axis_, Boolean keepdims, Nullable`1 typeCode, NDArray out) +> > at NumSharp.Backends.DefaultEngine.Dot(NDArray& left, NDArray& right) -### Comment 2 by @BlackholeGH (2021-06-27T10:07:04Z) - -I seem to have this same issue, in a similar context attempting to use np.dot to do a dot-product for two 1-D numpy arrays containing double values. Assuming we're not both doing something wrong, any workarounds beside calculating the dot product manually? - -> System.NotSupportedException - HResult=0x80131515 - Message=Specified method is not supported. - Source=NumSharp - StackTrace: - at NumSharp.NPTypeCodeExtensions.GetAccumulatingType(NPTypeCode typeCode) - at NumSharp.Backends.DefaultEngine.sum_elementwise(NDArray arr, Nullable`1 typeCode) - at NumSharp.Backends.DefaultEngine.ReduceAdd(NDArray& arr, Nullable`1 axis_, Boolean keepdims, Nullable`1 typeCode, NDArray out) - at NumSharp.Backends.DefaultEngine.Dot(NDArray& left, NDArray& right) - - -### Comment 3 by @moonlitlyra (2021-06-30T18:55:04Z) - -> I seem to have this same issue, in a similar context attempting to use np.dot to do a dot-product for two 1-D numpy arrays containing double values. Assuming we're not both doing something wrong, any workarounds beside calculating the dot product manually? -> -> > System.NotSupportedException -> > HResult=0x80131515 -> > Message=Specified method is not supported. -> > Source=NumSharp -> > StackTrace: -> > at NumSharp.NPTypeCodeExtensions.GetAccumulatingType(NPTypeCode typeCode) -> > at NumSharp.Backends.DefaultEngine.sum_elementwise(NDArray arr, Nullable`1 typeCode) at NumSharp.Backends.DefaultEngine.ReduceAdd(NDArray& arr, Nullable`1 axis_, Boolean keepdims, Nullable`1 typeCode, NDArray out) -> > at NumSharp.Backends.DefaultEngine.Dot(NDArray& left, NDArray& right) - -Hello, thankyou for commenting on this issue. No workarounds as far as I am aware, I ended up having to scrap part of my project sadly. Thanks anyway. +Hello, thankyou for commenting on this issue. No workarounds as far as I am aware, I ended up having to scrap part of my project sadly. Thanks anyway. diff --git a/docs/issues/issue-0447-np.sum-is-supported-on-numsharp0.20.5-but-not-on-numsharp0.30.0.md b/docs/issues/issue-0447-np.sum-is-supported-on-numsharp0.20.5-but-not-on-numsharp0.30.0.md index a14697f0..1fc580ae 100644 --- a/docs/issues/issue-0447-np.sum-is-supported-on-numsharp0.20.5-but-not-on-numsharp0.30.0.md +++ b/docs/issues/issue-0447-np.sum-is-supported-on-numsharp0.20.5-but-not-on-numsharp0.30.0.md @@ -1,88 +1,88 @@ -# #447: np.sum() Is supported on numsharp0.20.5, but not on NumSharp0.30.0 - -- **URL:** https://github.com/SciSharp/NumSharp/issues/447 -- **State:** OPEN -- **Author:** @lijianxin520 -- **Created:** 2021-04-13T06:35:26Z -- **Updated:** 2024-02-26T22:17:28Z - -## Description - -np.sum() Is supported on numsharp0.20.5, but not on NumSharp0.30.0 -the exception message :"Specified method is not supported." - -## Comments - -### Comment 1 by @Nucs (2021-04-13T11:24:36Z) - -What datatype are you trying to use? - -### Comment 2 by @lijianxin520 (2021-04-14T00:57:05Z) - - double s = np.sum(w * w); -w data type is NDArray; - -### Comment 3 by @lijianxin520 (2021-04-14T01:16:44Z) - -![image](https://user-images.githubusercontent.com/47262889/114640175-1b648500-9d02-11eb-8ef5-c75dcc150941.png) - - -### Comment 4 by @Nucs (2021-04-14T11:13:10Z) - -I mean what will this output on NumSharp 20.5? -``` C# -Console.WriteLine(w.dtype); -Console.WriteLine(s.dtype); -``` - -At version 30.x+ @Oceania2018 has removed many supported DTypes which might cause `NotSupportedException` or `NotImplementedException`. Some even return null. - -### Comment 5 by @lijianxin520 (2021-04-15T01:07:57Z) - -Thank you very much for your attention, the following is the supplementary content. -![image](https://user-images.githubusercontent.com/47262889/114799357-07845600-9dca-11eb-9374-e26c77e0e102.png) - - -### Comment 6 by @bigdimboom (2021-04-18T17:14:47Z) - -same problem. Is there a walkaround for now? - - -### Comment 7 by @Nucs (2021-04-21T04:46:24Z) - -@lijianxin520 I was not able to reproduce this locally, can you or @bigdimboom provide with a simple unit test that reproduces this and I'll take a deeper look. - -### Comment 8 by @ppsdatta (2021-04-23T10:14:54Z) - -Hello, -I encountered this problem as well and here's some data to help investigate: -1. A sample code which reproduces the problem on my Mac - Visual Studio. https://github.com/ppsdatta/NpSumIssue -2. With version 0.30.0 the code fails with the not supported error. -![Error screen shot](https://user-images.githubusercontent.com/18713580/115856850-9e948200-a44a-11eb-8a6a-4a0665002cad.png) -3. With version 0.20.5 the code works without runtime exception. -![No error screen shot](https://user-images.githubusercontent.com/18713580/115856971-c4ba2200-a44a-11eb-9e65-f97dbe509dbd.png) - - - -### Comment 9 by @badjano (2021-08-19T22:31:21Z) - -having exact same error, numsharp 0.30.0 -any workaround besides you know... for? - -### Comment 10 by @gv-collibris (2021-08-25T13:23:42Z) - -same error with NumSharp 0.30.0, with `np.sum(NDArray[])` - -### Comment 11 by @yuta0306 (2021-11-10T00:23:30Z) - -I also encountered the same error. -When the value of elements of NDArray is `double`, this error certainly occur. -To change the type `double` to `float` works well in my case. - -### Comment 12 by @guozifeng91 (2024-01-10T17:34:38Z) - -same error here, sum() works for int but not for double, using version 0.30.0 - -### Comment 13 by @PavanSuta (2024-02-26T22:17:27Z) - -I am using v4.0.30319 Numsharp. Getting the same error after calling the sum function. I am passing NDArray Double datatype. +# #447: np.sum() Is supported on numsharp0.20.5, but not on NumSharp0.30.0 + +- **URL:** https://github.com/SciSharp/NumSharp/issues/447 +- **State:** OPEN +- **Author:** @lijianxin520 +- **Created:** 2021-04-13T06:35:26Z +- **Updated:** 2024-02-26T22:17:28Z + +## Description + +np.sum() Is supported on numsharp0.20.5, but not on NumSharp0.30.0 +the exception message :"Specified method is not supported." + +## Comments + +### Comment 1 by @Nucs (2021-04-13T11:24:36Z) + +What datatype are you trying to use? + +### Comment 2 by @lijianxin520 (2021-04-14T00:57:05Z) + + double s = np.sum(w * w); +w data type is NDArray; + +### Comment 3 by @lijianxin520 (2021-04-14T01:16:44Z) + +![image](https://user-images.githubusercontent.com/47262889/114640175-1b648500-9d02-11eb-8ef5-c75dcc150941.png) + + +### Comment 4 by @Nucs (2021-04-14T11:13:10Z) + +I mean what will this output on NumSharp 20.5? +``` C# +Console.WriteLine(w.dtype); +Console.WriteLine(s.dtype); +``` + +At version 30.x+ @Oceania2018 has removed many supported DTypes which might cause `NotSupportedException` or `NotImplementedException`. Some even return null. + +### Comment 5 by @lijianxin520 (2021-04-15T01:07:57Z) + +Thank you very much for your attention, the following is the supplementary content. +![image](https://user-images.githubusercontent.com/47262889/114799357-07845600-9dca-11eb-9374-e26c77e0e102.png) + + +### Comment 6 by @bigdimboom (2021-04-18T17:14:47Z) + +same problem. Is there a walkaround for now? + + +### Comment 7 by @Nucs (2021-04-21T04:46:24Z) + +@lijianxin520 I was not able to reproduce this locally, can you or @bigdimboom provide with a simple unit test that reproduces this and I'll take a deeper look. + +### Comment 8 by @ppsdatta (2021-04-23T10:14:54Z) + +Hello, +I encountered this problem as well and here's some data to help investigate: +1. A sample code which reproduces the problem on my Mac - Visual Studio. https://github.com/ppsdatta/NpSumIssue +2. With version 0.30.0 the code fails with the not supported error. +![Error screen shot](https://user-images.githubusercontent.com/18713580/115856850-9e948200-a44a-11eb-8a6a-4a0665002cad.png) +3. With version 0.20.5 the code works without runtime exception. +![No error screen shot](https://user-images.githubusercontent.com/18713580/115856971-c4ba2200-a44a-11eb-9e65-f97dbe509dbd.png) + + + +### Comment 9 by @badjano (2021-08-19T22:31:21Z) + +having exact same error, numsharp 0.30.0 +any workaround besides you know... for? + +### Comment 10 by @gv-collibris (2021-08-25T13:23:42Z) + +same error with NumSharp 0.30.0, with `np.sum(NDArray[])` + +### Comment 11 by @yuta0306 (2021-11-10T00:23:30Z) + +I also encountered the same error. +When the value of elements of NDArray is `double`, this error certainly occur. +To change the type `double` to `float` works well in my case. + +### Comment 12 by @guozifeng91 (2024-01-10T17:34:38Z) + +same error here, sum() works for int but not for double, using version 0.30.0 + +### Comment 13 by @PavanSuta (2024-02-26T22:17:27Z) + +I am using v4.0.30319 Numsharp. Getting the same error after calling the sum function. I am passing NDArray Double datatype. diff --git a/docs/issues/issue-0448-debug.assert-...-causes-tests-to-stop-the-entire-process.md b/docs/issues/issue-0448-debug.assert-...-causes-tests-to-stop-the-entire-process.md index a37aa41d..3c780c18 100644 --- a/docs/issues/issue-0448-debug.assert-...-causes-tests-to-stop-the-entire-process.md +++ b/docs/issues/issue-0448-debug.assert-...-causes-tests-to-stop-the-entire-process.md @@ -1,21 +1,21 @@ -# #448: Debug.Assert(...) causes tests to stop the entire process +# #448: Debug.Assert(...) causes tests to stop the entire process + +- **URL:** https://github.com/SciSharp/NumSharp/issues/448 +- **State:** OPEN +- **Author:** @Nucs +- **Created:** 2021-04-23T12:03:33Z +- **Updated:** 2023-02-27T19:47:40Z +- **Labels:** bug +- **Assignees:** @Nucs + +## Description + +_No description provided._ + +## Comments + +### Comment 1 by @bojake (2023-02-27T19:47:40Z) + +The problem with this test is that the values array is not being broadcast/broadened properly. The assert expects the values array to match the size of the indices array. In this test case, though, the selector ("np < 3") is choosing 2 elements out of the 6 and the result is applying "-2" (which is another bug, btw). Changing the result value to "-2.0" gets past another bug but then you see where the actual bug in the SetIndiceND method resides. Before SetIndicesND can be called the "values" must be made to match the expected buffer size through implicit broadening. -- **URL:** https://github.com/SciSharp/NumSharp/issues/448 -- **State:** OPEN -- **Author:** @Nucs -- **Created:** 2021-04-23T12:03:33Z -- **Updated:** 2023-02-27T19:47:40Z -- **Labels:** bug -- **Assignees:** @Nucs - -## Description - -_No description provided._ - -## Comments - -### Comment 1 by @bojake (2023-02-27T19:47:40Z) - -The problem with this test is that the values array is not being broadcast/broadened properly. The assert expects the values array to match the size of the indices array. In this test case, though, the selector ("np < 3") is choosing 2 elements out of the 6 and the result is applying "-2" (which is another bug, btw). Changing the result value to "-2.0" gets past another bug but then you see where the actual bug in the SetIndiceND method resides. Before SetIndicesND can be called the "values" must be made to match the expected buffer size through implicit broadening. - -If you give "-2" as the value then the framework thinks you are setting the "size" of the NDArray for values instead of setting an actual value array of INTs. Oops. +If you give "-2" as the value then the framework thinks you are setting the "size" of the NDArray for values instead of setting an actual value array of INTs. Oops. diff --git a/docs/issues/issue-0449-isclose-is-not-implemented-and-allclose-test-is-ignored.md b/docs/issues/issue-0449-isclose-is-not-implemented-and-allclose-test-is-ignored.md index aeed86e0..ae7808fb 100644 --- a/docs/issues/issue-0449-isclose-is-not-implemented-and-allclose-test-is-ignored.md +++ b/docs/issues/issue-0449-isclose-is-not-implemented-and-allclose-test-is-ignored.md @@ -1,26 +1,26 @@ -# #449: IsClose is not implemented and allclose test is ignored +# #449: IsClose is not implemented and allclose test is ignored + +- **URL:** https://github.com/SciSharp/NumSharp/issues/449 +- **State:** OPEN +- **Author:** @koliyo +- **Created:** 2021-04-28T17:23:19Z +- **Updated:** 2021-04-29T09:56:42Z +- **Labels:** missing feature/s + +## Description + +These should probably be removed from the API if they are not properly implemented? -- **URL:** https://github.com/SciSharp/NumSharp/issues/449 -- **State:** OPEN -- **Author:** @koliyo -- **Created:** 2021-04-28T17:23:19Z -- **Updated:** 2021-04-29T09:56:42Z -- **Labels:** missing feature/s - -## Description - -These should probably be removed from the API if they are not properly implemented? - -```cs - [Ignore("TODO: fix this test")] - [TestMethod] - public void np_allclose_1D() -``` - -```cs - public override NDArray IsClose(NDArray a, NDArray b, double rtol = 1.0E-5, double atol = 1.0E-8, bool equal_nan = false) - { - // ... lots of commeted out code - return null; - } +```cs + [Ignore("TODO: fix this test")] + [TestMethod] + public void np_allclose_1D() ``` + +```cs + public override NDArray IsClose(NDArray a, NDArray b, double rtol = 1.0E-5, double atol = 1.0E-8, bool equal_nan = false) + { + // ... lots of commeted out code + return null; + } +``` diff --git a/docs/issues/issue-0451-np.argmax-is-slow.md b/docs/issues/issue-0451-np.argmax-is-slow.md index cb79fd0b..08a694c5 100644 --- a/docs/issues/issue-0451-np.argmax-is-slow.md +++ b/docs/issues/issue-0451-np.argmax-is-slow.md @@ -1,12 +1,12 @@ -# #451: np.argmax is slow - -- **URL:** https://github.com/SciSharp/NumSharp/issues/451 -- **State:** OPEN -- **Author:** @feiyuhuahuo -- **Created:** 2021-06-18T01:46:57Z -- **Updated:** 2021-06-18T01:46:57Z - -## Description - -![image](https://user-images.githubusercontent.com/32631344/122493133-bb4bd100-d019-11eb-9a89-728c4465d4e0.png) -`nd` is an array with shape of (1, 13, 512, 512), the time consumption of doing argmax on it is about 500ms. That's really slow. Any way to improve it? +# #451: np.argmax is slow + +- **URL:** https://github.com/SciSharp/NumSharp/issues/451 +- **State:** OPEN +- **Author:** @feiyuhuahuo +- **Created:** 2021-06-18T01:46:57Z +- **Updated:** 2021-06-18T01:46:57Z + +## Description + +![image](https://user-images.githubusercontent.com/32631344/122493133-bb4bd100-d019-11eb-9a89-728c4465d4e0.png) +`nd` is an array with shape of (1, 13, 512, 512), the time consumption of doing argmax on it is about 500ms. That's really slow. Any way to improve it? diff --git a/docs/issues/issue-0452-missing-feature-s-numsharps-np.around-method-is-missing-decimals-parameter.md b/docs/issues/issue-0452-missing-feature-s-numsharps-np.around-method-is-missing-decimals-parameter.md index f063674f..04399b6c 100644 --- a/docs/issues/issue-0452-missing-feature-s-numsharps-np.around-method-is-missing-decimals-parameter.md +++ b/docs/issues/issue-0452-missing-feature-s-numsharps-np.around-method-is-missing-decimals-parameter.md @@ -1,15 +1,15 @@ -# #452: [missing feature/s] NumSharp's np.around() method is missing decimals parameter which is available in NumPy +# #452: [missing feature/s] NumSharp's np.around() method is missing decimals parameter which is available in NumPy + +- **URL:** https://github.com/SciSharp/NumSharp/issues/452 +- **State:** OPEN +- **Author:** @shashi4u +- **Created:** 2021-07-19T03:40:26Z +- **Updated:** 2021-07-19T03:59:32Z + +## Description + +In NumPy user has control over on how many decimal places the floating point number can be rounded to by setting **decimal** argument in **[numpy.around()](https://numpy.org/doc/stable/reference/generated/numpy.around.html)** method. -- **URL:** https://github.com/SciSharp/NumSharp/issues/452 -- **State:** OPEN -- **Author:** @shashi4u -- **Created:** 2021-07-19T03:40:26Z -- **Updated:** 2021-07-19T03:59:32Z +However, NumSharp is missing this functionality. -## Description - -In NumPy user has control over on how many decimal places the floating point number can be rounded to by setting **decimal** argument in **[numpy.around()](https://numpy.org/doc/stable/reference/generated/numpy.around.html)** method. - -However, NumSharp is missing this functionality. - -It would be better if this feature is added to NumSharp's np.around() method. +It would be better if this feature is added to NumSharp's np.around() method. diff --git a/docs/issues/issue-0454-ndarray.lstqr-doesnt-work.md b/docs/issues/issue-0454-ndarray.lstqr-doesnt-work.md index 3a5dcba8..cf51ea3e 100644 --- a/docs/issues/issue-0454-ndarray.lstqr-doesnt-work.md +++ b/docs/issues/issue-0454-ndarray.lstqr-doesnt-work.md @@ -1,15 +1,15 @@ -# #454: NDArray.lstqr() doesn't work +# #454: NDArray.lstqr() doesn't work + +- **URL:** https://github.com/SciSharp/NumSharp/issues/454 +- **State:** OPEN +- **Author:** @yangjiandendi +- **Created:** 2021-07-24T18:39:31Z +- **Updated:** 2021-07-24T18:39:31Z + +## Description + +can you check why `NDArray.lstqr()` doesn't work? -- **URL:** https://github.com/SciSharp/NumSharp/issues/454 -- **State:** OPEN -- **Author:** @yangjiandendi -- **Created:** 2021-07-24T18:39:31Z -- **Updated:** 2021-07-24T18:39:31Z +I wanna finish this part, in python it like `a = np.linalg.lstsq(x,y)` -## Description - -can you check why `NDArray.lstqr()` doesn't work? - -I wanna finish this part, in python it like `a = np.linalg.lstsq(x,y)` - -how does it work in Numsharp? +how does it work in Numsharp? diff --git a/docs/issues/issue-0455-numsharp-does-not-allow-building-with-il2cpp-via-unity.md b/docs/issues/issue-0455-numsharp-does-not-allow-building-with-il2cpp-via-unity.md index e075394b..4ed970dd 100644 --- a/docs/issues/issue-0455-numsharp-does-not-allow-building-with-il2cpp-via-unity.md +++ b/docs/issues/issue-0455-numsharp-does-not-allow-building-with-il2cpp-via-unity.md @@ -1,23 +1,23 @@ -# #455: NumSharp does not allow building with IL2CPP via Unity +# #455: NumSharp does not allow building with IL2CPP via Unity + +- **URL:** https://github.com/SciSharp/NumSharp/issues/455 +- **State:** OPEN +- **Author:** @julia-koziel +- **Created:** 2021-07-27T09:14:17Z +- **Updated:** 2024-03-27T15:52:40Z + +## Description + +Hi, I am having trouble with building an Android app that is using a NumSharp package in Unity. -- **URL:** https://github.com/SciSharp/NumSharp/issues/455 -- **State:** OPEN -- **Author:** @julia-koziel -- **Created:** 2021-07-27T09:14:17Z -- **Updated:** 2024-03-27T15:52:40Z +This is the error that I keep receiving: +IL2CPP error for type 'NumSharp.LAPACKProviderType' in assembly '/UnityProject/Temp/StagingArea/assets/bin/Data/Managed/NumSharp.Core.dll' +Additional information: Value of type 'int' is too large to convert to short. -## Description - -Hi, I am having trouble with building an Android app that is using a NumSharp package in Unity. - -This is the error that I keep receiving: -IL2CPP error for type 'NumSharp.LAPACKProviderType' in assembly '/UnityProject/Temp/StagingArea/assets/bin/Data/Managed/NumSharp.Core.dll' -Additional information: Value of type 'int' is too large to convert to short. - -Any help would be much appreciated! Thanks - -## Comments - -### Comment 1 by @jacob-jacob-jacob (2024-03-27T15:52:31Z) - -Were you ever able to solve this? +Any help would be much appreciated! Thanks + +## Comments + +### Comment 1 by @jacob-jacob-jacob (2024-03-27T15:52:31Z) + +Were you ever able to solve this? diff --git a/docs/issues/issue-0456-silent-catastrophe-in-implicit-casting-singleton-array-to-value-type.md b/docs/issues/issue-0456-silent-catastrophe-in-implicit-casting-singleton-array-to-value-type.md index 5a5b282e..f4672ad6 100644 --- a/docs/issues/issue-0456-silent-catastrophe-in-implicit-casting-singleton-array-to-value-type.md +++ b/docs/issues/issue-0456-silent-catastrophe-in-implicit-casting-singleton-array-to-value-type.md @@ -1,41 +1,41 @@ -# #456: silent catastrophe in implicit casting singleton array to value type - -- **URL:** https://github.com/SciSharp/NumSharp/issues/456 -- **State:** OPEN -- **Author:** @dmacd -- **Created:** 2021-07-29T22:27:25Z -- **Updated:** 2021-07-29T22:28:14Z - -## Description - -Hi there! - -I love NumSharp and its been a key enabler of my current project (a neurofeedback platform built in Unity3d). -However I ran across some odd behavior I feel compelled to surface. Example: - -``` -var reactor_temp = -{-6.62420108914375} - -(float)reactor_temp --4.03896783E-28 - -(int)reactor_temp --1845493760 - -(double)reactor_temp --6.6242010891437531 -``` - -In this example, the actual dtype of the singleton array was double, yet I'm freely (and _implicitly_) able to cast the object to other numeric types with no warning or error. This is....counterintuitive...to say the least, has cost me several hours of debugging time, and I'm frankly lucky to have even caught it at all. Fortunately, I'm only using numsharp to manipulate people's brainwaves and not fissile material just yet :) - - -(As an aside: The issue surfaced for me when I changed an operation np.sum to np.mean, which changed the output type on me, contrary to expectation) - -If the implicit conversions cant be type-guarded or converted in a sane manner, would it make more sense to just remove them? - -Once again, grateful for all hard work that went in to this library! -Daniel - - +# #456: silent catastrophe in implicit casting singleton array to value type + +- **URL:** https://github.com/SciSharp/NumSharp/issues/456 +- **State:** OPEN +- **Author:** @dmacd +- **Created:** 2021-07-29T22:27:25Z +- **Updated:** 2021-07-29T22:28:14Z + +## Description + +Hi there! +I love NumSharp and its been a key enabler of my current project (a neurofeedback platform built in Unity3d). +However I ran across some odd behavior I feel compelled to surface. Example: + +``` +var reactor_temp = +{-6.62420108914375} + +(float)reactor_temp +-4.03896783E-28 + +(int)reactor_temp +-1845493760 + +(double)reactor_temp +-6.6242010891437531 +``` + +In this example, the actual dtype of the singleton array was double, yet I'm freely (and _implicitly_) able to cast the object to other numeric types with no warning or error. This is....counterintuitive...to say the least, has cost me several hours of debugging time, and I'm frankly lucky to have even caught it at all. Fortunately, I'm only using numsharp to manipulate people's brainwaves and not fissile material just yet :) + + +(As an aside: The issue surfaced for me when I changed an operation np.sum to np.mean, which changed the output type on me, contrary to expectation) + +If the implicit conversions cant be type-guarded or converted in a sane manner, would it make more sense to just remove them? + +Once again, grateful for all hard work that went in to this library! +Daniel + + + diff --git a/docs/issues/issue-0461-np.save-incorrectly-saves-system.byte-arrays-as-signed.md b/docs/issues/issue-0461-np.save-incorrectly-saves-system.byte-arrays-as-signed.md index cfc82190..823477eb 100644 --- a/docs/issues/issue-0461-np.save-incorrectly-saves-system.byte-arrays-as-signed.md +++ b/docs/issues/issue-0461-np.save-incorrectly-saves-system.byte-arrays-as-signed.md @@ -1,27 +1,27 @@ -# #461: np.save incorrectly saves System.Byte arrays as signed - -- **URL:** https://github.com/SciSharp/NumSharp/issues/461 -- **State:** OPEN -- **Author:** @rikkitook -- **Created:** 2021-08-04T12:06:31Z -- **Updated:** 2023-01-23T09:04:19Z - -## Description - -in function GetDtypeFromType -... -if (type == typeof(Byte)) - return "|i1"; -... -i1 gets translated to signed integer -https://numpy.org/doc/stable/user/basics.types.html - -## Comments - -### Comment 1 by @Cle-O (2023-01-23T09:03:24Z) - -Bump. This issue is still existing. -I am saving a numpy array (an image) with positive values only using _np.save()_. -Positive values only are verified calling _amin()_ on the array. -After reading the file again, the array contains negative values. -Is there a workaround for this? +# #461: np.save incorrectly saves System.Byte arrays as signed + +- **URL:** https://github.com/SciSharp/NumSharp/issues/461 +- **State:** OPEN +- **Author:** @rikkitook +- **Created:** 2021-08-04T12:06:31Z +- **Updated:** 2023-01-23T09:04:19Z + +## Description + +in function GetDtypeFromType +... +if (type == typeof(Byte)) + return "|i1"; +... +i1 gets translated to signed integer +https://numpy.org/doc/stable/user/basics.types.html + +## Comments + +### Comment 1 by @Cle-O (2023-01-23T09:03:24Z) + +Bump. This issue is still existing. +I am saving a numpy array (an image) with positive values only using _np.save()_. +Positive values only are verified calling _amin()_ on the array. +After reading the file again, the array contains negative values. +Is there a workaround for this? diff --git a/docs/issues/issue-0462-how-to-use-the-repo-to-convert-some-python-code.md b/docs/issues/issue-0462-how-to-use-the-repo-to-convert-some-python-code.md index 43e60718..aa30437e 100644 --- a/docs/issues/issue-0462-how-to-use-the-repo-to-convert-some-python-code.md +++ b/docs/issues/issue-0462-how-to-use-the-repo-to-convert-some-python-code.md @@ -1,65 +1,65 @@ -# #462: How to use the repo to convert some Python code? +# #462: How to use the repo to convert some Python code? + +- **URL:** https://github.com/SciSharp/NumSharp/issues/462 +- **State:** OPEN +- **Author:** @zydjohnHotmail +- **Created:** 2021-09-21T07:57:34Z +- **Updated:** 2021-12-01T05:58:40Z + +## Description + +Hello: +I have the following Python code to convert one RGB image to one YUV image, and use numpy to calculate an average of one column. -- **URL:** https://github.com/SciSharp/NumSharp/issues/462 -- **State:** OPEN -- **Author:** @zydjohnHotmail -- **Created:** 2021-09-21T07:57:34Z -- **Updated:** 2021-12-01T05:58:40Z +`import cv2 +import numpy as np -## Description +img_rgb = cv2.imread('C:/Images/1.PNG') +img_yuv = cv2.cvtColor(img_rgb,cv2.COLOR_BGR2YUV) +averageV = np.average(img_yuv[:,:,2]) +print(averageV); +` -Hello: -I have the following Python code to convert one RGB image to one YUV image, and use numpy to calculate an average of one column. - -`import cv2 -import numpy as np - -img_rgb = cv2.imread('C:/Images/1.PNG') -img_yuv = cv2.cvtColor(img_rgb,cv2.COLOR_BGR2YUV) -averageV = np.average(img_yuv[:,:,2]) -print(averageV); -` - -The Python code works well. Now, I want to change it to use C# code, as I have many other C# programs will need this averageV value. - -I have done the following: -1) I created one C# console project with Visual Studio 2019 (target .NET 5.0) -2) I installed necessary NUGET packages: -PM> Install-Package OpenCvSharp4 -Version 4.5.3.20210817 -PM> Install-Package NumSharp -Version 0.30.0 -3) I have the following C# code: -`using NumSharp; -using OpenCvSharp; -using System; - -namespace ConvertRGB2YUV -{ - class Program - { - public const string Image1_File = @"C:\Images\1.PNG"; - - static void Main(string[] args) - { - Mat img_rgb = Cv2.ImRead(Image1_File); - Mat img_yuv = img_rgb.CvtColor(ColorConversionCodes.RGB2YUV); - //var averageV = (img_yuv[:,:,2]); - //averageV = np.average(img_yuv[:,:, 2]) - } - } -}` - -I can run my code, and I can see the image: img_rgb and img_yuv. -But I have no idea on how to write the python corresponding statement: -averageV = np.average(img_yuv[:,:,2]) -In NumSharp, the img_yuv[…] simply doesn’t exist. -In Python, the img_yuv is treated like an array of float numbers. -How I can do this in NumSharp? -Please advise, -Thanks, +The Python code works well. Now, I want to change it to use C# code, as I have many other C# programs will need this averageV value. +I have done the following: +1) I created one C# console project with Visual Studio 2019 (target .NET 5.0) +2) I installed necessary NUGET packages: +PM> Install-Package OpenCvSharp4 -Version 4.5.3.20210817 +PM> Install-Package NumSharp -Version 0.30.0 +3) I have the following C# code: +`using NumSharp; +using OpenCvSharp; +using System; -## Comments +namespace ConvertRGB2YUV +{ + class Program + { + public const string Image1_File = @"C:\Images\1.PNG"; -### Comment 1 by @QingtaoLi1 (2021-12-01T05:58:40Z) + static void Main(string[] args) + { + Mat img_rgb = Cv2.ImRead(Image1_File); + Mat img_yuv = img_rgb.CvtColor(ColorConversionCodes.RGB2YUV); + //var averageV = (img_yuv[:,:,2]); + //averageV = np.average(img_yuv[:,:, 2]) + } + } +}` -C# doesn't support this kind of indices or slices. I guess you can explore the `NumSharp.Slice` class to reach your target. +I can run my code, and I can see the image: img_rgb and img_yuv. +But I have no idea on how to write the python corresponding statement: +averageV = np.average(img_yuv[:,:,2]) +In NumSharp, the img_yuv[…] simply doesn’t exist. +In Python, the img_yuv is treated like an array of float numbers. +How I can do this in NumSharp? +Please advise, +Thanks, + + +## Comments + +### Comment 1 by @QingtaoLi1 (2021-12-01T05:58:40Z) + +C# doesn't support this kind of indices or slices. I guess you can explore the `NumSharp.Slice` class to reach your target. diff --git a/docs/issues/issue-0464-new-api-request-to-port-np.random.triangular.md b/docs/issues/issue-0464-new-api-request-to-port-np.random.triangular.md index e28e1a48..4833438a 100644 --- a/docs/issues/issue-0464-new-api-request-to-port-np.random.triangular.md +++ b/docs/issues/issue-0464-new-api-request-to-port-np.random.triangular.md @@ -1,14 +1,14 @@ -# #464: New API request to port np.random.triangular - -- **URL:** https://github.com/SciSharp/NumSharp/issues/464 -- **State:** OPEN -- **Author:** @ppsdatta -- **Created:** 2021-11-23T11:50:37Z -- **Updated:** 2021-11-23T11:50:37Z - -## Description - -While porting a Python code to .NET using NumSharp as replacement for numpy - I found that there is no alternative version for `np.random.triangular` api present in NumSharp. I tried to search in the documents and didn't find any reference to it. Here is the link to the documentation for the API in numpy https://numpy.org/doc/stable/reference/random/generated/numpy.random.triangular.html - -NumSharp version I am using: `0.30.0`. - +# #464: New API request to port np.random.triangular + +- **URL:** https://github.com/SciSharp/NumSharp/issues/464 +- **State:** OPEN +- **Author:** @ppsdatta +- **Created:** 2021-11-23T11:50:37Z +- **Updated:** 2021-11-23T11:50:37Z + +## Description + +While porting a Python code to .NET using NumSharp as replacement for numpy - I found that there is no alternative version for `np.random.triangular` api present in NumSharp. I tried to search in the documents and didn't find any reference to it. Here is the link to the documentation for the API in numpy https://numpy.org/doc/stable/reference/random/generated/numpy.random.triangular.html + +NumSharp version I am using: `0.30.0`. + diff --git a/docs/issues/issue-0465-how-could-i-transform-between-numsharp.ndarray-with-tensorflow.numpy.ndarray.md b/docs/issues/issue-0465-how-could-i-transform-between-numsharp.ndarray-with-tensorflow.numpy.ndarray.md index c7e2426d..c882935a 100644 --- a/docs/issues/issue-0465-how-could-i-transform-between-numsharp.ndarray-with-tensorflow.numpy.ndarray.md +++ b/docs/issues/issue-0465-how-could-i-transform-between-numsharp.ndarray-with-tensorflow.numpy.ndarray.md @@ -1,18 +1,18 @@ -# #465: how could I transform between NumSharp.NDArray with Tensorflow.Numpy.NDArray? - -- **URL:** https://github.com/SciSharp/NumSharp/issues/465 -- **State:** OPEN -- **Author:** @cross-hello -- **Created:** 2021-11-24T06:38:01Z -- **Updated:** 2021-11-27T13:45:04Z - -## Description - -Both library complement the functionality of **Numpy** library. There are some lack for methods between. So I want to know the converting method. -Give me a hand~ - -## Comments - -### Comment 1 by @Oceania2018 (2021-11-27T13:45:04Z) - -What are the missing methods? +# #465: how could I transform between NumSharp.NDArray with Tensorflow.Numpy.NDArray? + +- **URL:** https://github.com/SciSharp/NumSharp/issues/465 +- **State:** OPEN +- **Author:** @cross-hello +- **Created:** 2021-11-24T06:38:01Z +- **Updated:** 2021-11-27T13:45:04Z + +## Description + +Both library complement the functionality of **Numpy** library. There are some lack for methods between. So I want to know the converting method. +Give me a hand~ + +## Comments + +### Comment 1 by @Oceania2018 (2021-11-27T13:45:04Z) + +What are the missing methods? diff --git a/docs/issues/issue-0466-bug-np.random.choice-raise-exception.md b/docs/issues/issue-0466-bug-np.random.choice-raise-exception.md index 986b5668..a07ca28b 100644 --- a/docs/issues/issue-0466-bug-np.random.choice-raise-exception.md +++ b/docs/issues/issue-0466-bug-np.random.choice-raise-exception.md @@ -1,52 +1,52 @@ -# #466: [Bug] np.random.choice raise Exception - -- **URL:** https://github.com/SciSharp/NumSharp/issues/466 -- **State:** OPEN -- **Author:** @QingtaoLi1 -- **Created:** 2021-11-30T07:54:33Z -- **Updated:** 2021-12-15T05:29:47Z - -## Description - -Hi, when using `np.random.choice`, I got an Exception with message "Specified method is not supported.", and the stack trace is: - -> at NumSharp.NPTypeCodeExtensions.GetAccumulatingType(NPTypeCode typeCode) -> at NumSharp.Backends.DefaultEngine.cumsum_elementwise(NDArray& arr, Nullable`1 typeCode) -> at NumSharp.Backends.DefaultEngine.ReduceCumAdd(NDArray& arr, Nullable`1 axis_, Nullable`1 typeCode) -> at NumSharp.np.cumsum(NDArray arr, Nullable`1 axis, Nullable`1 typeCode) - -## Comments - -### Comment 1 by @QingtaoLi1 (2021-11-30T07:57:42Z) - -It seems there is no UT for this function in this repo. - -### Comment 2 by @QingtaoLi1 (2021-11-30T08:00:22Z) - -Besides, another argument `replace` is not used at all in both overrides. - -### Comment 3 by @QingtaoLi1 (2021-11-30T08:28:09Z) - -I do a simple test on `np.cumsum` since it is in the stack trace: -> public static void RandomChoice() -> { -> var array = np.arange(1, 50265); -> var arrayDouble = 1.0 / array.astype(np.@double); -> var cumsum = np.cumsum(arrayDouble, typeCode: arrayDouble.typecode); // OK -> var cumsum2 = np.cumsum(arrayDouble); // raise Exception mentioned above -> } -> - -It looks like there's something wrong in the default typeCode. BTW, I'm using the latest NumSharp 0.30.0 version. - -### Comment 4 by @UCtreespring (2021-12-14T16:25:46Z) - -相同的问题,你解决了吗? - -### Comment 5 by @QingtaoLi1 (2021-12-15T02:55:05Z) - -目前发现的解决方案就是上面那样自己copy一个,加上typeCode就能跑了 - -### Comment 6 by @UCtreespring (2021-12-15T05:29:47Z) - -是我没有留意到那个“Ok”的注释,按照你的方案,我复制了官方Numsharp-master中的相关方法,添加了相关的typeCode参数,问题解决。非常感谢! +# #466: [Bug] np.random.choice raise Exception + +- **URL:** https://github.com/SciSharp/NumSharp/issues/466 +- **State:** OPEN +- **Author:** @QingtaoLi1 +- **Created:** 2021-11-30T07:54:33Z +- **Updated:** 2021-12-15T05:29:47Z + +## Description + +Hi, when using `np.random.choice`, I got an Exception with message "Specified method is not supported.", and the stack trace is: + +> at NumSharp.NPTypeCodeExtensions.GetAccumulatingType(NPTypeCode typeCode) +> at NumSharp.Backends.DefaultEngine.cumsum_elementwise(NDArray& arr, Nullable`1 typeCode) +> at NumSharp.Backends.DefaultEngine.ReduceCumAdd(NDArray& arr, Nullable`1 axis_, Nullable`1 typeCode) +> at NumSharp.np.cumsum(NDArray arr, Nullable`1 axis, Nullable`1 typeCode) + +## Comments + +### Comment 1 by @QingtaoLi1 (2021-11-30T07:57:42Z) + +It seems there is no UT for this function in this repo. + +### Comment 2 by @QingtaoLi1 (2021-11-30T08:00:22Z) + +Besides, another argument `replace` is not used at all in both overrides. + +### Comment 3 by @QingtaoLi1 (2021-11-30T08:28:09Z) + +I do a simple test on `np.cumsum` since it is in the stack trace: +> public static void RandomChoice() +> { +> var array = np.arange(1, 50265); +> var arrayDouble = 1.0 / array.astype(np.@double); +> var cumsum = np.cumsum(arrayDouble, typeCode: arrayDouble.typecode); // OK +> var cumsum2 = np.cumsum(arrayDouble); // raise Exception mentioned above +> } +> + +It looks like there's something wrong in the default typeCode. BTW, I'm using the latest NumSharp 0.30.0 version. + +### Comment 4 by @UCtreespring (2021-12-14T16:25:46Z) + +相同的问题,你解决了吗? + +### Comment 5 by @QingtaoLi1 (2021-12-15T02:55:05Z) + +目前发现的解决方案就是上面那样自己copy一个,加上typeCode就能跑了 + +### Comment 6 by @UCtreespring (2021-12-15T05:29:47Z) + +是我没有留意到那个“Ok”的注释,按照你的方案,我复制了官方Numsharp-master中的相关方法,添加了相关的typeCode参数,问题解决。非常感谢! diff --git a/docs/issues/issue-0467-numsharp-and-tensorflow.net-works-on-desktop-but-fails-on-cloud-web-service-.ne.md b/docs/issues/issue-0467-numsharp-and-tensorflow.net-works-on-desktop-but-fails-on-cloud-web-service-.ne.md index e74e8829..40a148e9 100644 --- a/docs/issues/issue-0467-numsharp-and-tensorflow.net-works-on-desktop-but-fails-on-cloud-web-service-.ne.md +++ b/docs/issues/issue-0467-numsharp-and-tensorflow.net-works-on-desktop-but-fails-on-cloud-web-service-.ne.md @@ -1,39 +1,39 @@ -# #467: NumSharp and Tensorflow.NET works on Desktop but fails on Cloud Web Service (.NET 5) - -- **URL:** https://github.com/SciSharp/NumSharp/issues/467 -- **State:** OPEN -- **Author:** @marsousi -- **Created:** 2021-12-06T04:56:23Z -- **Updated:** 2021-12-06T04:56:23Z - -## Description - -NumSharp and Tensorflow.NET work fine on my desktop computer. But once I publish it on the cloud service (Azure Web Service using ASP.NET Core - .NET 5), even running a simple code to define an NDArray gives the following error: - -_DllNotFoundException: Unable to load DLL 'tensorflow' or one of its dependencies: The specified module could not be found. (0x8007007E) -Tensorflow.c_api.TF_NewStatus() - -TypeInitializationException: The type initializer for 'Tensorflow.Binding' threw an exception. -Tensorflow.Binding.get_tf()_ - -The following packages are installed in Visual Studio Solution: - - -SciSharp.TensorFlow.Redist (2.3.1)
-NumSharp (0.30.0)
-NumSharp.Bitmap (0.30.0)
-SharpCV (0.10.1)
-Rensorflow.Net (0.60.5)
-Tensorflow.Keras (0.6.5)
-Google.Protobuf (3.19.1)
-Protobuf.Text (0.5.0)
-Serilog.Sinks.Console (4.0.1)
- -and some more but I don't think they would interfere with the above packages -
- -Besides, I tried to change the Release CPU from AnyCPU to x64, but then the cloud service fails running. - -Am I missing something? - +# #467: NumSharp and Tensorflow.NET works on Desktop but fails on Cloud Web Service (.NET 5) + +- **URL:** https://github.com/SciSharp/NumSharp/issues/467 +- **State:** OPEN +- **Author:** @marsousi +- **Created:** 2021-12-06T04:56:23Z +- **Updated:** 2021-12-06T04:56:23Z + +## Description + +NumSharp and Tensorflow.NET work fine on my desktop computer. But once I publish it on the cloud service (Azure Web Service using ASP.NET Core - .NET 5), even running a simple code to define an NDArray gives the following error: +_DllNotFoundException: Unable to load DLL 'tensorflow' or one of its dependencies: The specified module could not be found. (0x8007007E) +Tensorflow.c_api.TF_NewStatus() + +TypeInitializationException: The type initializer for 'Tensorflow.Binding' threw an exception. +Tensorflow.Binding.get_tf()_ + +The following packages are installed in Visual Studio Solution: + + +SciSharp.TensorFlow.Redist (2.3.1)
+NumSharp (0.30.0)
+NumSharp.Bitmap (0.30.0)
+SharpCV (0.10.1)
+Rensorflow.Net (0.60.5)
+Tensorflow.Keras (0.6.5)
+Google.Protobuf (3.19.1)
+Protobuf.Text (0.5.0)
+Serilog.Sinks.Console (4.0.1)
+ +and some more but I don't think they would interfere with the above packages +
+ +Besides, I tried to change the Release CPU from AnyCPU to x64, but then the cloud service fails running. + +Am I missing something? + + diff --git a/docs/issues/issue-0468-np-array.convolve-returning-null.md b/docs/issues/issue-0468-np-array.convolve-returning-null.md index ba56aafa..82ae56a2 100644 --- a/docs/issues/issue-0468-np-array.convolve-returning-null.md +++ b/docs/issues/issue-0468-np-array.convolve-returning-null.md @@ -1,202 +1,202 @@ -# #468: np_array.convolve returning Null - -- **URL:** https://github.com/SciSharp/NumSharp/issues/468 -- **State:** OPEN -- **Author:** @dklein9500 -- **Created:** 2021-12-06T10:57:13Z -- **Updated:** 2022-06-26T22:42:49Z - -## Description - -Hi, -I am using this function to smooth some measurement data, sadly it returns null for some reason. -Here is the example code that produced the same result: - -``` -int filter_length = 5; -List data = new List() {1, 34, 3, 4, 22, 4, 24, 42, 24, 22, 4 }; // Just some random numbers for testing -var array = data.ToArray(); -NDArray np_array = new NDArray(array); -var filter = np.ones(filterLength); -NDArray filtered_array = np_array.convolve(filter, "same"); // Here null is returned -``` -There is probably a better way to construct the NDArray, but I think the code should still work. -What am I doing wrong? -Thanks in advance! - -## Comments - -### Comment 1 by @abbefus (2022-04-28T18:02:26Z) - -This is because someone put "return null" a few lines down in the code: - -``` -public NDArray convolve(NDArray rhs, string mode = "full") -{ - var lhs = this; - int nf = lhs.shape[0]; - int ng = rhs.shape[0]; - - if (ndim > 1 || rhs.ndim > 1) - throw new IncorrectShapeException(); - var retType = np._FindCommonType(lhs, rhs); - return null; -``` - -That's enough to guarantee you get null every time. Who knows if the rest of the code ever worked. - - -### Comment 2 by @guillermoe7 (2022-06-24T18:01:36Z) - -Also facing this problem. -Have any idea if this function was in working condition before? - -### Comment 3 by @abbefus (2022-06-24T19:14:29Z) - -This function works when it is rewritten, leading me to believe it did work before. Here is the function as I rewrote it -- verified against the python version. Sorry for my comments. - -``` -public static class NumpyExtensions -{ - - // NOTE: lhs must always be bigger than rhs -- - public static NDArray LinearConvolution(this NDArray lhs, NDArray rhs, ConvolveModes mode = ConvolveModes.Full) - { - if (lhs.ndim > 1 || rhs.ndim > 1) - throw new IncorrectShapeException("Both arrays must be 1-dimensional"); - - if (lhs.Shape.Size < rhs.Shape.Size) - throw new IncorrectShapeException("Right-hand side array must be smaller than left-hand side."); - - - // NOTE: - // NDArray.GetData just runs NDArray.Storage.GetData - // which returns NDArray.Storage.InternalArray == NDArray.Array - // so all three methods are practically interchangeable so why they had to make things complicated is beyond me - - ArraySlice lhsarr = lhs.GetData(); - ArraySlice rhsarr = rhs.GetData(); - - int nf = lhs.shape[0]; - int ng = rhs.shape[0]; - - - switch (mode) - { - case ConvolveModes.Full: - { - int n = nf + ng - 1; - - NDArray ret = new NDArray(Shape.Vector(n), true); - ArraySlice outArray = ret.GetData(); - - for (int idx = 0; idx < n; ++idx) - { - int jmn = (idx >= ng - 1) ? (idx - (ng - 1)) : 0; - int jmx = (idx < nf - 1) ? idx : nf - 1; - - for (int jdx = jmn; jdx <= jmx; ++jdx) - { - outArray[idx] += lhsarr[jdx] * rhsarr[idx - jdx]; - } - } - - return ret; - } - - case ConvolveModes.Valid: - { - var min_v = (nf < ng) ? lhsarr : rhsarr; - var max_v = (nf < ng) ? rhsarr : lhsarr; - - int n = Math.Max(nf, ng) - Math.Min(nf, ng) + 1; - - var ret = new NDArray(typeof(double), Shape.Vector(n), true); - ArraySlice outArray = ret.GetData(); - - for (int idx = 0; idx < n; ++idx) - { - int kdx = idx; - - for (int jdx = (min_v.Count - 1); jdx >= 0; --jdx) - { - outArray[idx] += min_v[jdx] * max_v[kdx]; - ++kdx; - } - } - - return ret; - } - - case ConvolveModes.Same: - { - // https://stackoverflow.com/questions/38194270/matlab-convolution-same-to-numpy-convolve - var npad = rhs.shape[0] - 1; - - if (npad % 2 == 1) - { - unsafe - { - npad = (int)Math.Floor(((double)npad) / 2.0); - - ArraySlice arr = ArraySlice.Allocate(npad + lhsarr.Count); - Span span = new Span(arr.VoidAddress, arr.Count); - lhsarr.CopyTo(span, npad); - var retnd = new NDArray(new UnmanagedStorage(arr, Shape.Vector(lhsarr.Count))); - return retnd.LinearConvolution(rhs, ConvolveModes.Valid); - } - } - else - { - throw new NotImplementedException("Cannot implement because NDArray.Address is protected."); - // I suppose we could extend NDArray and create a getter for Address - //{ - // unsafe - // { - // npad = npad / 2; - - // NPTypeCode retType = NPTypeCode.Double; - // NDArray puffer = new NDArray(retType, Shape.Vector(npad + lhsarr.Count), true); - // ArraySlice puffslice = puffer.Data(); // not sure this is equal to storage - // Span span = new Span(puffslice.VoidAddress, puffslice.Count); - // //lhsarr.CopyTo(puffer.Storage.AsSpan <#202>(), npad); - // lhsarr.CopyTo(span, npad); - // NDArray np1New = puffer; - - // puffer = new NDArray(retType, Shape.Vector(npad + np1New.size), true); - // int cpylen = np1New.size * sizeof(double); - // Buffer.MemoryCopy(np1New.Address, (double)puffer.Address) + npad, cpylen, cpylen); - // return puffer.convolve(rhs, "valid"); - // } - //} - } - } - default: - return lhs.LinearConvolution(rhs); - } - } -} -``` - -``` -public enum ConvolveModes -{ - Full, - Same, - Valid -} +# #468: np_array.convolve returning Null + +- **URL:** https://github.com/SciSharp/NumSharp/issues/468 +- **State:** OPEN +- **Author:** @dklein9500 +- **Created:** 2021-12-06T10:57:13Z +- **Updated:** 2022-06-26T22:42:49Z + +## Description + +Hi, +I am using this function to smooth some measurement data, sadly it returns null for some reason. +Here is the example code that produced the same result: + +``` +int filter_length = 5; +List data = new List() {1, 34, 3, 4, 22, 4, 24, 42, 24, 22, 4 }; // Just some random numbers for testing +var array = data.ToArray(); +NDArray np_array = new NDArray(array); +var filter = np.ones(filterLength); +NDArray filtered_array = np_array.convolve(filter, "same"); // Here null is returned +``` +There is probably a better way to construct the NDArray, but I think the code should still work. +What am I doing wrong? +Thanks in advance! + +## Comments + +### Comment 1 by @abbefus (2022-04-28T18:02:26Z) + +This is because someone put "return null" a few lines down in the code: + +``` +public NDArray convolve(NDArray rhs, string mode = "full") +{ + var lhs = this; + int nf = lhs.shape[0]; + int ng = rhs.shape[0]; + + if (ndim > 1 || rhs.ndim > 1) + throw new IncorrectShapeException(); + var retType = np._FindCommonType(lhs, rhs); + return null; ``` -### Comment 4 by @guillermoe7 (2022-06-26T22:42:49Z) - -Hello abbefus, - -Thanks a lot. That's quite a good code example. -Just one more bit of help. Seems my files are not up to date as there are some resources not available in my SliceAndDice install: -ArraySlice.Allocate() -ArraySlice.CopyTo() -Shape.Vector() - -Can you please show me where to get the proper version where these methods may be found? - -Thank you very much. +That's enough to guarantee you get null every time. Who knows if the rest of the code ever worked. + + +### Comment 2 by @guillermoe7 (2022-06-24T18:01:36Z) + +Also facing this problem. +Have any idea if this function was in working condition before? + +### Comment 3 by @abbefus (2022-06-24T19:14:29Z) + +This function works when it is rewritten, leading me to believe it did work before. Here is the function as I rewrote it -- verified against the python version. Sorry for my comments. + +``` +public static class NumpyExtensions +{ + + // NOTE: lhs must always be bigger than rhs -- + public static NDArray LinearConvolution(this NDArray lhs, NDArray rhs, ConvolveModes mode = ConvolveModes.Full) + { + if (lhs.ndim > 1 || rhs.ndim > 1) + throw new IncorrectShapeException("Both arrays must be 1-dimensional"); + + if (lhs.Shape.Size < rhs.Shape.Size) + throw new IncorrectShapeException("Right-hand side array must be smaller than left-hand side."); + + + // NOTE: + // NDArray.GetData just runs NDArray.Storage.GetData + // which returns NDArray.Storage.InternalArray == NDArray.Array + // so all three methods are practically interchangeable so why they had to make things complicated is beyond me + + ArraySlice lhsarr = lhs.GetData(); + ArraySlice rhsarr = rhs.GetData(); + + int nf = lhs.shape[0]; + int ng = rhs.shape[0]; + + + switch (mode) + { + case ConvolveModes.Full: + { + int n = nf + ng - 1; + + NDArray ret = new NDArray(Shape.Vector(n), true); + ArraySlice outArray = ret.GetData(); + + for (int idx = 0; idx < n; ++idx) + { + int jmn = (idx >= ng - 1) ? (idx - (ng - 1)) : 0; + int jmx = (idx < nf - 1) ? idx : nf - 1; + + for (int jdx = jmn; jdx <= jmx; ++jdx) + { + outArray[idx] += lhsarr[jdx] * rhsarr[idx - jdx]; + } + } + + return ret; + } + + case ConvolveModes.Valid: + { + var min_v = (nf < ng) ? lhsarr : rhsarr; + var max_v = (nf < ng) ? rhsarr : lhsarr; + + int n = Math.Max(nf, ng) - Math.Min(nf, ng) + 1; + + var ret = new NDArray(typeof(double), Shape.Vector(n), true); + ArraySlice outArray = ret.GetData(); + + for (int idx = 0; idx < n; ++idx) + { + int kdx = idx; + + for (int jdx = (min_v.Count - 1); jdx >= 0; --jdx) + { + outArray[idx] += min_v[jdx] * max_v[kdx]; + ++kdx; + } + } + + return ret; + } + + case ConvolveModes.Same: + { + // https://stackoverflow.com/questions/38194270/matlab-convolution-same-to-numpy-convolve + var npad = rhs.shape[0] - 1; + + if (npad % 2 == 1) + { + unsafe + { + npad = (int)Math.Floor(((double)npad) / 2.0); + + ArraySlice arr = ArraySlice.Allocate(npad + lhsarr.Count); + Span span = new Span(arr.VoidAddress, arr.Count); + lhsarr.CopyTo(span, npad); + var retnd = new NDArray(new UnmanagedStorage(arr, Shape.Vector(lhsarr.Count))); + return retnd.LinearConvolution(rhs, ConvolveModes.Valid); + } + } + else + { + throw new NotImplementedException("Cannot implement because NDArray.Address is protected."); + // I suppose we could extend NDArray and create a getter for Address + //{ + // unsafe + // { + // npad = npad / 2; + + // NPTypeCode retType = NPTypeCode.Double; + // NDArray puffer = new NDArray(retType, Shape.Vector(npad + lhsarr.Count), true); + // ArraySlice puffslice = puffer.Data(); // not sure this is equal to storage + // Span span = new Span(puffslice.VoidAddress, puffslice.Count); + // //lhsarr.CopyTo(puffer.Storage.AsSpan <#202>(), npad); + // lhsarr.CopyTo(span, npad); + // NDArray np1New = puffer; + + // puffer = new NDArray(retType, Shape.Vector(npad + np1New.size), true); + // int cpylen = np1New.size * sizeof(double); + // Buffer.MemoryCopy(np1New.Address, (double)puffer.Address) + npad, cpylen, cpylen); + // return puffer.convolve(rhs, "valid"); + // } + //} + } + } + default: + return lhs.LinearConvolution(rhs); + } + } +} +``` + +``` +public enum ConvolveModes +{ + Full, + Same, + Valid +} +``` + +### Comment 4 by @guillermoe7 (2022-06-26T22:42:49Z) + +Hello abbefus, + +Thanks a lot. That's quite a good code example. +Just one more bit of help. Seems my files are not up to date as there are some resources not available in my SliceAndDice install: +ArraySlice.Allocate() +ArraySlice.CopyTo() +Shape.Vector() + +Can you please show me where to get the proper version where these methods may be found? + +Thank you very much. diff --git a/docs/issues/issue-0470-numsharp0.30.0-np.random.choice-method-missing-cause-exception.md b/docs/issues/issue-0470-numsharp0.30.0-np.random.choice-method-missing-cause-exception.md index a5ed1073..635ffc2a 100644 --- a/docs/issues/issue-0470-numsharp0.30.0-np.random.choice-method-missing-cause-exception.md +++ b/docs/issues/issue-0470-numsharp0.30.0-np.random.choice-method-missing-cause-exception.md @@ -1,25 +1,25 @@ -# #470: Numsharp0.30.0 np.random.choice() method missing cause Exception +# #470: Numsharp0.30.0 np.random.choice() method missing cause Exception + +- **URL:** https://github.com/SciSharp/NumSharp/issues/470 +- **State:** OPEN +- **Author:** @UCtreespring +- **Created:** 2021-12-14T10:52:50Z +- **Updated:** 2021-12-14T10:52:50Z + +## Description + +System.NotSupportedException + HResult=0x80131515 + Source=NumSharp + StackTrace: + at NumSharp.NPTypeCodeExtensions.GetAccumulatingType(NPTypeCode typeCode) + at NumSharp.Backends.DefaultEngine.cumsum_elementwise(NDArray& arr, Nullable`1 typeCode) + at NumSharp.Backends.DefaultEngine.ReduceCumAdd(NDArray& arr, Nullable`1 axis_, Nullable`1 typeCode) + at NumSharp.NumPyRandom.choice(Int32 a, Shape shape, Boolean replace, Double[] probabilities) + at NumSharp.NumPyRandom.choice(NDArray arr, Shape shape, Boolean replace, Double[] probabilities) + at PolicyGradient_TF050.PolicyGradient.ChooseAction(NDArray observation, NDArray actions, NDArray actionmask) -- **URL:** https://github.com/SciSharp/NumSharp/issues/470 -- **State:** OPEN -- **Author:** @UCtreespring -- **Created:** 2021-12-14T10:52:50Z -- **Updated:** 2021-12-14T10:52:50Z - -## Description - -System.NotSupportedException - HResult=0x80131515 - Source=NumSharp - StackTrace: - at NumSharp.NPTypeCodeExtensions.GetAccumulatingType(NPTypeCode typeCode) - at NumSharp.Backends.DefaultEngine.cumsum_elementwise(NDArray& arr, Nullable`1 typeCode) - at NumSharp.Backends.DefaultEngine.ReduceCumAdd(NDArray& arr, Nullable`1 axis_, Nullable`1 typeCode) - at NumSharp.NumPyRandom.choice(Int32 a, Shape shape, Boolean replace, Double[] probabilities) - at NumSharp.NumPyRandom.choice(NDArray arr, Shape shape, Boolean replace, Double[] probabilities) - at PolicyGradient_TF050.PolicyGradient.ChooseAction(NDArray observation, NDArray actions, NDArray actionmask) - -I‘m new to this , - -Thanks for help. +I‘m new to this , +Thanks for help. + diff --git a/docs/issues/issue-0471-unhandled-exception-system.notsupportedexception-specified-method-is-not-suppo.md b/docs/issues/issue-0471-unhandled-exception-system.notsupportedexception-specified-method-is-not-suppo.md index f2e59035..f1bed8ee 100644 --- a/docs/issues/issue-0471-unhandled-exception-system.notsupportedexception-specified-method-is-not-suppo.md +++ b/docs/issues/issue-0471-unhandled-exception-system.notsupportedexception-specified-method-is-not-suppo.md @@ -1,17 +1,17 @@ -# #471: Unhandled Exception: System.NotSupportedException: Specified method is not supported. +# #471: Unhandled Exception: System.NotSupportedException: Specified method is not supported. + +- **URL:** https://github.com/SciSharp/NumSharp/issues/471 +- **State:** OPEN +- **Author:** @KonardAdams +- **Created:** 2021-12-15T16:57:20Z +- **Updated:** 2021-12-15T16:57:20Z + +## Description + +**I am getting an error at this line of code:** + `double theta3_2 = Math.Atan2(a3, d4) - Math.Atan2(K / p3, -np.sqrt(np.power(1 - (K / p3), 2)));` -- **URL:** https://github.com/SciSharp/NumSharp/issues/471 -- **State:** OPEN -- **Author:** @KonardAdams -- **Created:** 2021-12-15T16:57:20Z -- **Updated:** 2021-12-15T16:57:20Z - -## Description - -**I am getting an error at this line of code:** - `double theta3_2 = Math.Atan2(a3, d4) - Math.Atan2(K / p3, -np.sqrt(np.power(1 - (K / p3), 2)));` - -Unhandled Exception: System.NotSupportedException: Specified method is not supported. - at NumSharp.Backends.DefaultEngine.Negate(NDArray& nd) in D:\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Default.Negate.cs:line 119 - at NumSharp.NDArray.op_UnaryNegation(NDArray x) in D:\SciSharp\NumSharp\src\NumSharp.Core\Operations\Elementwise\NDArray.Primitive.cs:line 10 - at Robotics.InverseNP.Main(String[] args) in C:\Users\.......................... +Unhandled Exception: System.NotSupportedException: Specified method is not supported. + at NumSharp.Backends.DefaultEngine.Negate(NDArray& nd) in D:\SciSharp\NumSharp\src\NumSharp.Core\Backends\Default\Math\Default.Negate.cs:line 119 + at NumSharp.NDArray.op_UnaryNegation(NDArray x) in D:\SciSharp\NumSharp\src\NumSharp.Core\Operations\Elementwise\NDArray.Primitive.cs:line 10 + at Robotics.InverseNP.Main(String[] args) in C:\Users\.......................... diff --git a/docs/issues/issue-0472-how-to-calculate-the-rank-of-a-matrix-with-numsharp.md b/docs/issues/issue-0472-how-to-calculate-the-rank-of-a-matrix-with-numsharp.md index f0fe63a1..15e0623f 100644 --- a/docs/issues/issue-0472-how-to-calculate-the-rank-of-a-matrix-with-numsharp.md +++ b/docs/issues/issue-0472-how-to-calculate-the-rank-of-a-matrix-with-numsharp.md @@ -1,15 +1,15 @@ -# #472: How to calculate the rank of a matrix with NumSharp? - -- **URL:** https://github.com/SciSharp/NumSharp/issues/472 -- **State:** OPEN -- **Author:** @drtujugkhjk -- **Created:** 2021-12-20T10:42:27Z -- **Updated:** 2021-12-20T10:42:27Z - -## Description - -I have a question,but I'm new to this. -I want to compute the rank of a matrix, but could not do it when I tried the following. - np.linalg.matrix_rank(A) ; - A:NDArray -What is wrong with it? How do I calculate the rank of a matrix? +# #472: How to calculate the rank of a matrix with NumSharp? + +- **URL:** https://github.com/SciSharp/NumSharp/issues/472 +- **State:** OPEN +- **Author:** @drtujugkhjk +- **Created:** 2021-12-20T10:42:27Z +- **Updated:** 2021-12-20T10:42:27Z + +## Description + +I have a question,but I'm new to this. +I want to compute the rank of a matrix, but could not do it when I tried the following. + np.linalg.matrix_rank(A) ; + A:NDArray +What is wrong with it? How do I calculate the rank of a matrix? diff --git a/docs/issues/issue-0473-bit-shift-and-bit-or.md b/docs/issues/issue-0473-bit-shift-and-bit-or.md index 407b3b0a..9af2f5ac 100644 --- a/docs/issues/issue-0473-bit-shift-and-bit-or.md +++ b/docs/issues/issue-0473-bit-shift-and-bit-or.md @@ -1,16 +1,16 @@ -# #473: Bit shift and bit or - -- **URL:** https://github.com/SciSharp/NumSharp/issues/473 -- **State:** OPEN -- **Author:** @MichielMans -- **Created:** 2021-12-28T13:21:27Z -- **Updated:** 2021-12-28T13:21:27Z - -## Description - -Is it possible to bit-shift and bit-or all values in a NDArray with NumSharp, whiteout a for loop? With Numpy (python) is works as follows: - -r_shift = r<<8 -g_shift = g<<0 -rg_concat = r_shift|g_shift +# #473: Bit shift and bit or + +- **URL:** https://github.com/SciSharp/NumSharp/issues/473 +- **State:** OPEN +- **Author:** @MichielMans +- **Created:** 2021-12-28T13:21:27Z +- **Updated:** 2021-12-28T13:21:27Z + +## Description + +Is it possible to bit-shift and bit-or all values in a NDArray with NumSharp, whiteout a for loop? With Numpy (python) is works as follows: +r_shift = r<<8 +g_shift = g<<0 +rg_concat = r_shift|g_shift + diff --git a/docs/issues/issue-0475-tobitmap-fails-if-not-contiguous-because-of-broadcast-mismatch.md b/docs/issues/issue-0475-tobitmap-fails-if-not-contiguous-because-of-broadcast-mismatch.md index 1a5a1b76..52838d2a 100644 --- a/docs/issues/issue-0475-tobitmap-fails-if-not-contiguous-because-of-broadcast-mismatch.md +++ b/docs/issues/issue-0475-tobitmap-fails-if-not-contiguous-because-of-broadcast-mismatch.md @@ -1,12 +1,12 @@ -# #475: ToBitmap fails if not contiguous because of Broadcast mismatch - -- **URL:** https://github.com/SciSharp/NumSharp/issues/475 -- **State:** OPEN -- **Author:** @ponzis -- **Created:** 2022-02-09T15:51:52Z -- **Updated:** 2022-02-09T15:54:08Z - -## Description - -When using the `public static unsafe Bitmap ToBitmap(this NDArray nd, int width, int height, PixelFormat format = PixelFormat.DontCare)` passing a NDArray of shape (1, x, y, 3) fails due to broadcast mismatch at `(LeftShape, RightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape);` due to broadcasting with `(x*y*3)` and `(1, x, y, 3)` the work around is to clone the NDArray so that it is continues or change the shape of the function so that it has a correct shape. - +# #475: ToBitmap fails if not contiguous because of Broadcast mismatch + +- **URL:** https://github.com/SciSharp/NumSharp/issues/475 +- **State:** OPEN +- **Author:** @ponzis +- **Created:** 2022-02-09T15:51:52Z +- **Updated:** 2022-02-09T15:54:08Z + +## Description + +When using the `public static unsafe Bitmap ToBitmap(this NDArray nd, int width, int height, PixelFormat format = PixelFormat.DontCare)` passing a NDArray of shape (1, x, y, 3) fails due to broadcast mismatch at `(LeftShape, RightShape) = DefaultEngine.Broadcast(lhs.Shape, rhs.Shape);` due to broadcasting with `(x*y*3)` and `(1, x, y, 3)` the work around is to clone the NDArray so that it is continues or change the shape of the function so that it has a correct shape. + diff --git a/docs/issues/issue-0476-numsharp.core-contains-many-debug.assert-lines.md b/docs/issues/issue-0476-numsharp.core-contains-many-debug.assert-lines.md index d5ef63db..1b2f57aa 100644 --- a/docs/issues/issue-0476-numsharp.core-contains-many-debug.assert-lines.md +++ b/docs/issues/issue-0476-numsharp.core-contains-many-debug.assert-lines.md @@ -1,14 +1,14 @@ -# #476: Numsharp.Core contains many Debug.Assert() lines - -- **URL:** https://github.com/SciSharp/NumSharp/issues/476 -- **State:** OPEN -- **Author:** @rtwalterson -- **Created:** 2022-03-30T20:56:02Z -- **Updated:** 2022-03-30T20:56:02Z - -## Description - -great work at your side. -simply don't understand the reason why. -example: file Default.NonZero.cs - +# #476: Numsharp.Core contains many Debug.Assert() lines + +- **URL:** https://github.com/SciSharp/NumSharp/issues/476 +- **State:** OPEN +- **Author:** @rtwalterson +- **Created:** 2022-03-30T20:56:02Z +- **Updated:** 2022-03-30T20:56:02Z + +## Description + +great work at your side. +simply don't understand the reason why. +example: file Default.NonZero.cs + diff --git a/docs/issues/issue-0477-different-result-between-numpy-and-numsharp-with-np.matmul-function.md b/docs/issues/issue-0477-different-result-between-numpy-and-numsharp-with-np.matmul-function.md index 0bb00a39..00867d37 100644 --- a/docs/issues/issue-0477-different-result-between-numpy-and-numsharp-with-np.matmul-function.md +++ b/docs/issues/issue-0477-different-result-between-numpy-and-numsharp-with-np.matmul-function.md @@ -1,43 +1,43 @@ -# #477: Different Result between NumPy and NumSharp with np.matmul Function +# #477: Different Result between NumPy and NumSharp with np.matmul Function + +- **URL:** https://github.com/SciSharp/NumSharp/issues/477 +- **State:** OPEN +- **Author:** @Koyamin +- **Created:** 2022-04-05T15:29:06Z +- **Updated:** 2022-09-09T18:42:50Z + +## Description + +I am a new learner of NumSharp and now I want to calculate the matmul product of two NDArrays by using `np.matmul` function: +```Csharp +using NumSharp; -- **URL:** https://github.com/SciSharp/NumSharp/issues/477 -- **State:** OPEN -- **Author:** @Koyamin -- **Created:** 2022-04-05T15:29:06Z -- **Updated:** 2022-09-09T18:42:50Z +var a = np.arange(2 * 2 * 3).reshape((2, 2, 3)); +var b = np.array(new double[] { 1, 2, 3 }); +var res = np.matmul(a, b); +``` +The value of `res` is as follow: +``` +[[6], [24]] +``` +However I have tried the same code in Python: +```Python +import numpy as np -## Description - -I am a new learner of NumSharp and now I want to calculate the matmul product of two NDArrays by using `np.matmul` function: -```Csharp -using NumSharp; - -var a = np.arange(2 * 2 * 3).reshape((2, 2, 3)); -var b = np.array(new double[] { 1, 2, 3 }); -var res = np.matmul(a, b); -``` -The value of `res` is as follow: -``` -[[6], [24]] -``` -However I have tried the same code in Python: -```Python -import numpy as np - -a = np.arange(2*2*3).reshape((2,2,3)) -b = np.array([1,2,3]) -res = np.matmul(a, b) -``` -Now the value of `res` is -``` -[[ 8 26] - [44 62]] -``` -I have no idea about it. I want to get the result in Python, what should I do? - -## Comments - -### Comment 1 by @ChengYen-Tang (2022-09-09T18:42:50Z) - -這個專案好像已經沒有在維護了,我有發現一個更完善的專案 -https://github.com/Quansight-Labs/numpy.net +a = np.arange(2*2*3).reshape((2,2,3)) +b = np.array([1,2,3]) +res = np.matmul(a, b) +``` +Now the value of `res` is +``` +[[ 8 26] + [44 62]] +``` +I have no idea about it. I want to get the result in Python, what should I do? + +## Comments + +### Comment 1 by @ChengYen-Tang (2022-09-09T18:42:50Z) + +這個專案好像已經沒有在維護了,我有發現一個更完善的專案 +https://github.com/Quansight-Labs/numpy.net diff --git a/docs/issues/issue-0479-lacking-outdated-documentation.md b/docs/issues/issue-0479-lacking-outdated-documentation.md index 1d7e572e..0095445e 100644 --- a/docs/issues/issue-0479-lacking-outdated-documentation.md +++ b/docs/issues/issue-0479-lacking-outdated-documentation.md @@ -1,19 +1,19 @@ -# #479: Lacking/Outdated Documentation - -- **URL:** https://github.com/SciSharp/NumSharp/issues/479 -- **State:** OPEN -- **Author:** @Tianmaru -- **Created:** 2022-08-16T00:19:13Z -- **Updated:** 2022-09-09T18:40:32Z - -## Description - -Many methods don't seem to be documented at all, or did I just fail to find the right place to look for? -Also, is this project still maintained or is it discontinued? Seems like not much happened since the release of Numpy.NET, which is a pity. - -## Comments - -### Comment 1 by @ChengYen-Tang (2022-09-09T18:40:32Z) - -I found a more complete package, maybe you can try it. -https://github.com/Quansight-Labs/numpy.net +# #479: Lacking/Outdated Documentation + +- **URL:** https://github.com/SciSharp/NumSharp/issues/479 +- **State:** OPEN +- **Author:** @Tianmaru +- **Created:** 2022-08-16T00:19:13Z +- **Updated:** 2022-09-09T18:40:32Z + +## Description + +Many methods don't seem to be documented at all, or did I just fail to find the right place to look for? +Also, is this project still maintained or is it discontinued? Seems like not much happened since the release of Numpy.NET, which is a pity. + +## Comments + +### Comment 1 by @ChengYen-Tang (2022-09-09T18:40:32Z) + +I found a more complete package, maybe you can try it. +https://github.com/Quansight-Labs/numpy.net diff --git a/docs/issues/issue-0480-numsharp-equivalent-for-unravel-index.md b/docs/issues/issue-0480-numsharp-equivalent-for-unravel-index.md index 8b8fdc1c..8e5499fb 100644 --- a/docs/issues/issue-0480-numsharp-equivalent-for-unravel-index.md +++ b/docs/issues/issue-0480-numsharp-equivalent-for-unravel-index.md @@ -1,18 +1,18 @@ -# #480: Numsharp equivalent for unravel_index - -- **URL:** https://github.com/SciSharp/NumSharp/issues/480 -- **State:** OPEN -- **Author:** @iainross -- **Created:** 2022-08-30T15:49:50Z -- **Updated:** 2022-09-09T18:40:19Z - -## Description - -I can't find anything that maps onto `numpy.unravel_index` - is it missing from the `NumSharp` API or am I missing something? - -## Comments - -### Comment 1 by @ChengYen-Tang (2022-09-09T18:40:19Z) - -I found a more complete package, maybe you can try it. -https://github.com/Quansight-Labs/numpy.net +# #480: Numsharp equivalent for unravel_index + +- **URL:** https://github.com/SciSharp/NumSharp/issues/480 +- **State:** OPEN +- **Author:** @iainross +- **Created:** 2022-08-30T15:49:50Z +- **Updated:** 2022-09-09T18:40:19Z + +## Description + +I can't find anything that maps onto `numpy.unravel_index` - is it missing from the `NumSharp` API or am I missing something? + +## Comments + +### Comment 1 by @ChengYen-Tang (2022-09-09T18:40:19Z) + +I found a more complete package, maybe you can try it. +https://github.com/Quansight-Labs/numpy.net diff --git a/docs/issues/issue-0481-normal-disttribution-in-numsharp.md b/docs/issues/issue-0481-normal-disttribution-in-numsharp.md index 1ab1a5db..6a41f759 100644 --- a/docs/issues/issue-0481-normal-disttribution-in-numsharp.md +++ b/docs/issues/issue-0481-normal-disttribution-in-numsharp.md @@ -1,14 +1,14 @@ -# #481: Normal disttribution in NumSharp +# #481: Normal disttribution in NumSharp + +- **URL:** https://github.com/SciSharp/NumSharp/issues/481 +- **State:** OPEN +- **Author:** @rthota90 +- **Created:** 2022-10-11T17:19:38Z +- **Updated:** 2022-10-11T17:19:38Z + +## Description + +Hi, -- **URL:** https://github.com/SciSharp/NumSharp/issues/481 -- **State:** OPEN -- **Author:** @rthota90 -- **Created:** 2022-10-11T17:19:38Z -- **Updated:** 2022-10-11T17:19:38Z - -## Description - -Hi, - -I am looking for a solution to do normal distributions NORM.S.INV, NORM.S.DIST in C# .NET. -Is it possible to achieve using NumSharp? If so How? +I am looking for a solution to do normal distributions NORM.S.INV, NORM.S.DIST in C# .NET. +Is it possible to achieve using NumSharp? If so How? diff --git a/docs/issues/issue-0483-how-to-convert-list-ndarray-to-ndarray.md b/docs/issues/issue-0483-how-to-convert-list-ndarray-to-ndarray.md index 1ac23329..a94ab62d 100644 --- a/docs/issues/issue-0483-how-to-convert-list-ndarray-to-ndarray.md +++ b/docs/issues/issue-0483-how-to-convert-list-ndarray-to-ndarray.md @@ -1,22 +1,22 @@ -# #483: How to convert List to NDArray +# #483: How to convert List to NDArray + +- **URL:** https://github.com/SciSharp/NumSharp/issues/483 +- **State:** OPEN +- **Author:** @williamlzw +- **Created:** 2022-12-13T14:12:14Z +- **Updated:** 2022-12-13T14:13:02Z + +## Description + +str = '00000.jpg 130,83,205,108,0 130,137,154,161,1 255,137,279,160,2 125,186,177,208,3 210,186,236,208,4 285,186,311,208,5 130,237,400,292,6 230,328,555,354,7' +line = str.split() +box = np.array([np.array(list(map(int, box.split(','))))for box in line[1:]]) +print(box) -- **URL:** https://github.com/SciSharp/NumSharp/issues/483 -- **State:** OPEN -- **Author:** @williamlzw -- **Created:** 2022-12-13T14:12:14Z -- **Updated:** 2022-12-13T14:13:02Z - -## Description - -str = '00000.jpg 130,83,205,108,0 130,137,154,161,1 255,137,279,160,2 125,186,177,208,3 210,186,236,208,4 285,186,311,208,5 130,237,400,292,6 230,328,555,354,7' -line = str.split() -box = np.array([np.array(list(map(int, box.split(','))))for box in line[1:]]) -print(box) - -string str = "00000.jpg 130,83,205,108,0 130,137,154,161,1 255,137,279,160,2 125,186,177,208,3 210,186,236,208,4 285,186,311,208,5 130,237,400,292,6 230,328,555,354,7"; -var line = str.Split(); -List> allList = new List>(); -var boxarr = line.Skip(1).Select(box => np.array(box.Split(',').Select(int.Parse))).ToList(); -var aa = boxarr.ToArray();//How to convert List\ to NDArray - +string str = "00000.jpg 130,83,205,108,0 130,137,154,161,1 255,137,279,160,2 125,186,177,208,3 210,186,236,208,4 285,186,311,208,5 130,237,400,292,6 230,328,555,354,7"; +var line = str.Split(); +List> allList = new List>(); +var boxarr = line.Skip(1).Select(box => np.array(box.Split(',').Select(int.Parse))).ToList(); +var aa = boxarr.ToArray();//How to convert List\ to NDArray + diff --git a/docs/issues/issue-0484-np.load-system.exception.md b/docs/issues/issue-0484-np.load-system.exception.md index b34c7a0b..0a9d337e 100644 --- a/docs/issues/issue-0484-np.load-system.exception.md +++ b/docs/issues/issue-0484-np.load-system.exception.md @@ -1,21 +1,21 @@ -# #484: np.load System.Exception +# #484: np.load System.Exception + +- **URL:** https://github.com/SciSharp/NumSharp/issues/484 +- **State:** OPEN +- **Author:** @Kiord +- **Created:** 2022-12-20T13:31:58Z +- **Updated:** 2022-12-20T13:31:58Z + +## Description + +I am loading several arrays in Unity using NumSharp's `np.load`. It works well for most of them but one throws an exception : -- **URL:** https://github.com/SciSharp/NumSharp/issues/484 -- **State:** OPEN -- **Author:** @Kiord -- **Created:** 2022-12-20T13:31:58Z -- **Updated:** 2022-12-20T13:31:58Z +![image](https://user-images.githubusercontent.com/79104227/208677853-547fae45-ffaa-4106-8670-6876fd810665.png) -## Description +In NumPy `np.load` works fine for this this array. -I am loading several arrays in Unity using NumSharp's `np.load`. It works well for most of them but one throws an exception : - -![image](https://user-images.githubusercontent.com/79104227/208677853-547fae45-ffaa-4106-8670-6876fd810665.png) - -In NumPy `np.load` works fine for this this array. - -[here is a link to download this specific array](https://github.com/SciSharp/NumSharp/files/10268745/array.zip). - -What is the reason behind this exception ? - -Thank you +[here is a link to download this specific array](https://github.com/SciSharp/NumSharp/files/10268745/array.zip). + +What is the reason behind this exception ? + +Thank you diff --git a/docs/issues/issue-0486-slice-assign.md b/docs/issues/issue-0486-slice-assign.md index cf8b706a..a37c6036 100644 --- a/docs/issues/issue-0486-slice-assign.md +++ b/docs/issues/issue-0486-slice-assign.md @@ -1,29 +1,29 @@ -# #486: Slice assign +# #486: Slice assign + +- **URL:** https://github.com/SciSharp/NumSharp/issues/486 +- **State:** OPEN +- **Author:** @burungiu +- **Created:** 2023-01-30T10:42:54Z +- **Updated:** 2023-02-28T17:38:50Z + +## Description + +Hello everyone, there is a way to do assigment as in python? +Example: +`preds[:, :, 0] = preds[:, :, 0] % heatmapWidth` -- **URL:** https://github.com/SciSharp/NumSharp/issues/486 -- **State:** OPEN -- **Author:** @burungiu -- **Created:** 2023-01-30T10:42:54Z -- **Updated:** 2023-02-28T17:38:50Z +Thank you + +## Comments + +### Comment 1 by @bojake (2023-02-28T17:38:50Z) + +There is an issue with auto-broadening of scalar operands in the framework. -## Description +For instance: -Hello everyone, there is a way to do assigment as in python? -Example: -`preds[:, :, 0] = preds[:, :, 0] % heatmapWidth` - -Thank you +var foo = (array > 12f); // fails +var foo = np.full(12f, array.shape); +var result = (array > foo); // successful -## Comments - -### Comment 1 by @bojake (2023-02-28T17:38:50Z) - -There is an issue with auto-broadening of scalar operands in the framework. - -For instance: - -var foo = (array > 12f); // fails -var foo = np.full(12f, array.shape); -var result = (array > foo); // successful - -In your "heatmapWidth" operand just create an "np.full(heatmapWidth, preds.shape)" NDArray and use that as the operand. I bet that will work for you. +In your "heatmapWidth" operand just create an "np.full(heatmapWidth, preds.shape)" NDArray and use that as the operand. I bet that will work for you. diff --git a/docs/issues/issue-0487-linspace-to-array-as-type-float-while-other-functions-as-type-double.md b/docs/issues/issue-0487-linspace-to-array-as-type-float-while-other-functions-as-type-double.md index 68414921..a58c1097 100644 --- a/docs/issues/issue-0487-linspace-to-array-as-type-float-while-other-functions-as-type-double.md +++ b/docs/issues/issue-0487-linspace-to-array-as-type-float-while-other-functions-as-type-double.md @@ -1,25 +1,25 @@ -# #487: linspace to Array as type float, while other functions as type double +# #487: linspace to Array as type float, while other functions as type double + +- **URL:** https://github.com/SciSharp/NumSharp/issues/487 +- **State:** OPEN +- **Author:** @changjian-github +- **Created:** 2023-02-13T12:51:52Z +- **Updated:** 2023-02-13T12:52:41Z + +## Description + +``` +using NumSharp; -- **URL:** https://github.com/SciSharp/NumSharp/issues/487 -- **State:** OPEN -- **Author:** @changjian-github -- **Created:** 2023-02-13T12:51:52Z -- **Updated:** 2023-02-13T12:52:41Z - -## Description - -``` -using NumSharp; - -class Program -{ - static void Main(string[] args) - { - double[] x = np.arange(-1, 1.1, 0.1).ToArray(); - float[] y = np.linspace(-1, 1, 21).ToArray(); - double[] z = np.random.rand(21).ToArray(); - Console.WriteLine("compile passed"); - } -} -``` -Changing float to double will result in an error. +class Program +{ + static void Main(string[] args) + { + double[] x = np.arange(-1, 1.1, 0.1).ToArray(); + float[] y = np.linspace(-1, 1, 21).ToArray(); + double[] z = np.random.rand(21).ToArray(); + Console.WriteLine("compile passed"); + } +} +``` +Changing float to double will result in an error. diff --git a/docs/issues/issue-0488-np.random.choice-raised-system.notsupportedexception.md b/docs/issues/issue-0488-np.random.choice-raised-system.notsupportedexception.md index c9ee5b58..dfa00dc6 100644 --- a/docs/issues/issue-0488-np.random.choice-raised-system.notsupportedexception.md +++ b/docs/issues/issue-0488-np.random.choice-raised-system.notsupportedexception.md @@ -1,35 +1,35 @@ -# #488: np.random.choice raised System.NotSupportedException +# #488: np.random.choice raised System.NotSupportedException + +- **URL:** https://github.com/SciSharp/NumSharp/issues/488 +- **State:** OPEN +- **Author:** @alvinfebriando +- **Created:** 2023-02-15T06:20:28Z +- **Updated:** 2023-02-27T22:57:51Z + +## Description + +error on np.random.choice, it said "Specified method isn not supported". Is my usage wrong? -- **URL:** https://github.com/SciSharp/NumSharp/issues/488 -- **State:** OPEN -- **Author:** @alvinfebriando -- **Created:** 2023-02-15T06:20:28Z -- **Updated:** 2023-02-27T22:57:51Z - -## Description - -error on np.random.choice, it said "Specified method isn not supported". Is my usage wrong? - -```csharp -var score = np.arange(1,6); -var p = new[] { 0.2, 0.2, 0.2, 0.2, 0.2 }; -var result = np.random.choice(score, probabilities: p); -``` - -Stack trace -``` -Unhandled exception. System.NotSupportedException: Specified method is not supported. - at NumSharp.NPTypeCodeExtensions.GetAccumulatingType(NPTypeCode typeCode) - at NumSharp.Backends.DefaultEngine.cumsum_elementwise(NDArray& arr, Nullable`1 typeCode) - at NumSharp.Backends.DefaultEngine.ReduceCumAdd(NDArray& arr, Nullable`1 axis_, Nullable`1 typeCode) - at NumSharp.np.cumsum(NDArray arr, Nullable`1 axis, Nullable`1 typeCode) - at NumSharp.NumPyRandom.choice(Int32 a, Shape shape, Boolean replace, Double[] probabilities) - at NumSharp.NumPyRandom.choice(NDArray arr, Shape shape, Boolean replace, Double[] probabilities) - at Program.
$(String[] args) +```csharp +var score = np.arange(1,6); +var p = new[] { 0.2, 0.2, 0.2, 0.2, 0.2 }; +var result = np.random.choice(score, probabilities: p); ``` -## Comments - -### Comment 1 by @bojake (2023-02-27T22:57:51Z) - -I created a test case with your exact code and ran it using my dev fork of NumSharp. No errors were produced. Are you using an out dated NumSharp? +Stack trace +``` +Unhandled exception. System.NotSupportedException: Specified method is not supported. + at NumSharp.NPTypeCodeExtensions.GetAccumulatingType(NPTypeCode typeCode) + at NumSharp.Backends.DefaultEngine.cumsum_elementwise(NDArray& arr, Nullable`1 typeCode) + at NumSharp.Backends.DefaultEngine.ReduceCumAdd(NDArray& arr, Nullable`1 axis_, Nullable`1 typeCode) + at NumSharp.np.cumsum(NDArray arr, Nullable`1 axis, Nullable`1 typeCode) + at NumSharp.NumPyRandom.choice(Int32 a, Shape shape, Boolean replace, Double[] probabilities) + at NumSharp.NumPyRandom.choice(NDArray arr, Shape shape, Boolean replace, Double[] probabilities) + at Program.
$(String[] args) +``` + +## Comments + +### Comment 1 by @bojake (2023-02-27T22:57:51Z) + +I created a test case with your exact code and ran it using my dev fork of NumSharp. No errors were produced. Are you using an out dated NumSharp? diff --git a/docs/issues/issue-0490-np.random.choice-with-replace-false-produces-duplicates.md b/docs/issues/issue-0490-np.random.choice-with-replace-false-produces-duplicates.md index 768636e4..f8af2825 100644 --- a/docs/issues/issue-0490-np.random.choice-with-replace-false-produces-duplicates.md +++ b/docs/issues/issue-0490-np.random.choice-with-replace-false-produces-duplicates.md @@ -1,13 +1,13 @@ -# #490: np.random.choice with replace: false produces duplicates +# #490: np.random.choice with replace: false produces duplicates + +- **URL:** https://github.com/SciSharp/NumSharp/issues/490 +- **State:** OPEN +- **Author:** @GThibeault +- **Created:** 2023-03-06T00:04:52Z +- **Updated:** 2023-03-06T00:04:52Z + +## Description + +e.g. np.random.choice(71, new Shape(40), **replace: false**) is producing duplicates. -- **URL:** https://github.com/SciSharp/NumSharp/issues/490 -- **State:** OPEN -- **Author:** @GThibeault -- **Created:** 2023-03-06T00:04:52Z -- **Updated:** 2023-03-06T00:04:52Z - -## Description - -e.g. np.random.choice(71, new Shape(40), **replace: false**) is producing duplicates. - -I've tried setting the seed to provide a reproducible example, but that doesn't seem to work either. +I've tried setting the seed to provide a reproducible example, but that doesn't seem to work either. diff --git a/docs/issues/issue-0491-tobitmap-datatype-mistmatch.md b/docs/issues/issue-0491-tobitmap-datatype-mistmatch.md index 6c337994..481c57db 100644 --- a/docs/issues/issue-0491-tobitmap-datatype-mistmatch.md +++ b/docs/issues/issue-0491-tobitmap-datatype-mistmatch.md @@ -1,21 +1,21 @@ -# #491: ToBitmap() - datatype mistmatch +# #491: ToBitmap() - datatype mistmatch + +- **URL:** https://github.com/SciSharp/NumSharp/issues/491 +- **State:** OPEN +- **Author:** @davidvct +- **Created:** 2023-03-08T09:12:45Z +- **Updated:** 2023-03-08T09:12:45Z + +## Description + +I tried to convert a numsharp array with integers to bitmap. -- **URL:** https://github.com/SciSharp/NumSharp/issues/491 -- **State:** OPEN -- **Author:** @davidvct -- **Created:** 2023-03-08T09:12:45Z -- **Updated:** 2023-03-08T09:12:45Z - -## Description - -I tried to convert a numsharp array with integers to bitmap. - -``` -array_rgb_numsharp = array_rgb_numsharp.reshape(1, 300, 300, 3); -Bitmap image = array_rgb_numsharp.ToBitmap(); -``` -and encounter this error: -System.InvalidCastException: 'Unable to perform CopyTo when T does not match dtype, use non-generic overload instead.' - -How can I fix it? +``` +array_rgb_numsharp = array_rgb_numsharp.reshape(1, 300, 300, 3); +Bitmap image = array_rgb_numsharp.ToBitmap(); +``` +and encounter this error: +System.InvalidCastException: 'Unable to perform CopyTo when T does not match dtype, use non-generic overload instead.' +How can I fix it? + diff --git a/docs/issues/issue-0492-critical-vulnerability-in-version-5.0.2-of-system.drawing.common.md b/docs/issues/issue-0492-critical-vulnerability-in-version-5.0.2-of-system.drawing.common.md index 71ef16f0..f78189d9 100644 --- a/docs/issues/issue-0492-critical-vulnerability-in-version-5.0.2-of-system.drawing.common.md +++ b/docs/issues/issue-0492-critical-vulnerability-in-version-5.0.2-of-system.drawing.common.md @@ -1,17 +1,17 @@ -# #492: critical vulnerability in version 5.0.2 of system.drawing.common +# #492: critical vulnerability in version 5.0.2 of system.drawing.common + +- **URL:** https://github.com/SciSharp/NumSharp/issues/492 +- **State:** OPEN +- **Author:** @jkl-ds +- **Created:** 2023-03-17T15:26:36Z +- **Updated:** 2023-03-17T15:27:51Z + +## Description + +"When a .NET application utilizing libgdiplus on a non-Windows system accepts input, an attacker could send a specially crafted request that could result in remote code execution." -- **URL:** https://github.com/SciSharp/NumSharp/issues/492 -- **State:** OPEN -- **Author:** @jkl-ds -- **Created:** 2023-03-17T15:26:36Z -- **Updated:** 2023-03-17T15:27:51Z +https://github.com/dotnet/announcements/issues/176 -## Description +Please upgrade to version 5.0.3 or higher. -"When a .NET application utilizing libgdiplus on a non-Windows system accepts input, an attacker could send a specially crafted request that could result in remote code execution." - -https://github.com/dotnet/announcements/issues/176 - -Please upgrade to version 5.0.3 or higher. - -https://github.com/SciSharp/NumSharp/blob/master/src/NumSharp.Bitmap/NumSharp.Bitmap.csproj#L78 +https://github.com/SciSharp/NumSharp/blob/master/src/NumSharp.Bitmap/NumSharp.Bitmap.csproj#L78 diff --git a/docs/issues/issue-0493-numsharp-array-output-in-.net-interactive-notebooks-is-misleading.md b/docs/issues/issue-0493-numsharp-array-output-in-.net-interactive-notebooks-is-misleading.md index ef743d31..4112d195 100644 --- a/docs/issues/issue-0493-numsharp-array-output-in-.net-interactive-notebooks-is-misleading.md +++ b/docs/issues/issue-0493-numsharp-array-output-in-.net-interactive-notebooks-is-misleading.md @@ -1,13 +1,13 @@ -# #493: Numsharp array output in .net interactive notebooks is misleading +# #493: Numsharp array output in .net interactive notebooks is misleading + +- **URL:** https://github.com/SciSharp/NumSharp/issues/493 +- **State:** OPEN +- **Author:** @oxygen-dioxide +- **Created:** 2023-03-23T06:47:54Z +- **Updated:** 2023-03-23T06:47:54Z + +## Description + +image -- **URL:** https://github.com/SciSharp/NumSharp/issues/493 -- **State:** OPEN -- **Author:** @oxygen-dioxide -- **Created:** 2023-03-23T06:47:54Z -- **Updated:** 2023-03-23T06:47:54Z - -## Description - -image - -In [.net interactive notebooks](https://github.com/dotnet/interactive), no matter how many dimensions an array has, it will be output as an 1d array. +In [.net interactive notebooks](https://github.com/dotnet/interactive), no matter how many dimensions an array has, it will be output as an 1d array. diff --git a/docs/issues/issue-0494-hello-has-scisharp-numsharp-stopped-development-and-maintenance.md b/docs/issues/issue-0494-hello-has-scisharp-numsharp-stopped-development-and-maintenance.md index e4c6c78e..f4684a73 100644 --- a/docs/issues/issue-0494-hello-has-scisharp-numsharp-stopped-development-and-maintenance.md +++ b/docs/issues/issue-0494-hello-has-scisharp-numsharp-stopped-development-and-maintenance.md @@ -1,22 +1,22 @@ -# #494: Hello, has SciSharp/NumSharp stopped development and maintenance? - -- **URL:** https://github.com/SciSharp/NumSharp/issues/494 -- **State:** OPEN -- **Author:** @sdyby2006 -- **Created:** 2023-07-03T01:24:46Z -- **Updated:** 2024-03-31T17:58:17Z - -## Description - -Hello, has SciSharp/NumSharp stopped development and maintenance? - -## Comments - -### Comment 1 by @HCareLou (2023-09-11T16:39:49Z) - -I think so,it's so sad. - -### Comment 2 by @tingspain (2024-03-31T17:58:16Z) - -Any news about this topic? - +# #494: Hello, has SciSharp/NumSharp stopped development and maintenance? + +- **URL:** https://github.com/SciSharp/NumSharp/issues/494 +- **State:** OPEN +- **Author:** @sdyby2006 +- **Created:** 2023-07-03T01:24:46Z +- **Updated:** 2024-03-31T17:58:17Z + +## Description + +Hello, has SciSharp/NumSharp stopped development and maintenance? + +## Comments + +### Comment 1 by @HCareLou (2023-09-11T16:39:49Z) + +I think so,it's so sad. + +### Comment 2 by @tingspain (2024-03-31T17:58:16Z) + +Any news about this topic? + diff --git a/docs/issues/issue-0497-np.linalg.pinv-not-supported.md b/docs/issues/issue-0497-np.linalg.pinv-not-supported.md index 490e67cb..3be48845 100644 --- a/docs/issues/issue-0497-np.linalg.pinv-not-supported.md +++ b/docs/issues/issue-0497-np.linalg.pinv-not-supported.md @@ -1,23 +1,23 @@ -# #497: np.linalg.pinv not supported +# #497: np.linalg.pinv not supported + +- **URL:** https://github.com/SciSharp/NumSharp/issues/497 +- **State:** OPEN +- **Author:** @gsgou +- **Created:** 2023-08-12T12:35:37Z +- **Updated:** 2023-10-20T17:05:22Z + +## Description + +Here is a link to what I think is the python sources for np.linalg: +https://github.com/numpy/numpy/blob/master/numpy/linalg/linalg.py -- **URL:** https://github.com/SciSharp/NumSharp/issues/497 -- **State:** OPEN -- **Author:** @gsgou -- **Created:** 2023-08-12T12:35:37Z -- **Updated:** 2023-10-20T17:05:22Z - -## Description - -Here is a link to what I think is the python sources for np.linalg: -https://github.com/numpy/numpy/blob/master/numpy/linalg/linalg.py - -Other implementations: -https://github.com/TheAlgorithms/C-Sharp/blob/master/Algorithms/Numeric/Pseudoinverse/PseudoInverse.cs -https://github.com/accord-net/framework/blob/master/Sources/Accord.Math/Matrix/Matrix.Linear.Generated.cs#L298 - - -## Comments - -### Comment 1 by @YariLAN (2023-10-20T17:05:22Z) - -It’s very necessary, by the way - I have a lab on it(( +Other implementations: +https://github.com/TheAlgorithms/C-Sharp/blob/master/Algorithms/Numeric/Pseudoinverse/PseudoInverse.cs +https://github.com/accord-net/framework/blob/master/Sources/Accord.Math/Matrix/Matrix.Linear.Generated.cs#L298 + + +## Comments + +### Comment 1 by @YariLAN (2023-10-20T17:05:22Z) + +It’s very necessary, by the way - I have a lab on it(( diff --git a/docs/issues/issue-0498-is-there-an-example-on-how-to-use-it-with-ironpython.md b/docs/issues/issue-0498-is-there-an-example-on-how-to-use-it-with-ironpython.md index 415c6f51..e091411c 100644 --- a/docs/issues/issue-0498-is-there-an-example-on-how-to-use-it-with-ironpython.md +++ b/docs/issues/issue-0498-is-there-an-example-on-how-to-use-it-with-ironpython.md @@ -1,27 +1,27 @@ -# #498: Is there an example on how to use it with IronPython? +# #498: Is there an example on how to use it with IronPython? + +- **URL:** https://github.com/SciSharp/NumSharp/issues/498 +- **State:** OPEN +- **Author:** @william19941994 +- **Created:** 2023-08-22T01:52:28Z +- **Updated:** 2023-08-22T01:52:28Z + +## Description + +I have a big project using c# + wpf +.net framework 4. and I can upgrade to 4.8 or 4.7.2 +and a supplier send some python examples to me. +I have to add some python script to the old project. I don't want to rewrite. -- **URL:** https://github.com/SciSharp/NumSharp/issues/498 -- **State:** OPEN -- **Author:** @william19941994 -- **Created:** 2023-08-22T01:52:28Z -- **Updated:** 2023-08-22T01:52:28Z +I added IronPython yesterday, but it uses hardware communication lib, I replaced with a c# object. +and then, I found that it uses numpy. +I added another small c# class. +and then, I found that it uses lots of numpy functions. +I download this project and added a wrapper class to redirect the result. +and then, this project need System.Memory.dll 4.0.1.1, while my project has 4.5.5 .... +and I changed the prj.exe.config to lower dll version. +my exe can't run now. -## Description - -I have a big project using c# + wpf +.net framework 4. and I can upgrade to 4.8 or 4.7.2 -and a supplier send some python examples to me. -I have to add some python script to the old project. I don't want to rewrite. - -I added IronPython yesterday, but it uses hardware communication lib, I replaced with a c# object. -and then, I found that it uses numpy. -I added another small c# class. -and then, I found that it uses lots of numpy functions. -I download this project and added a wrapper class to redirect the result. -and then, this project need System.Memory.dll 4.0.1.1, while my project has 4.5.5 .... -and I changed the prj.exe.config to lower dll version. -my exe can't run now. - -I'm re-compiling this csprj now. - -Does anyone have done this before? and where can I find a whole example or blog? +I'm re-compiling this csprj now. +Does anyone have done this before? and where can I find a whole example or blog? + diff --git a/docs/issues/issue-0499-possible-typo-tomulidimarray.md b/docs/issues/issue-0499-possible-typo-tomulidimarray.md index cc796d5d..f82befc2 100644 --- a/docs/issues/issue-0499-possible-typo-tomulidimarray.md +++ b/docs/issues/issue-0499-possible-typo-tomulidimarray.md @@ -1,21 +1,21 @@ -# #499: Possible typo "ToMuliDimArray()" +# #499: Possible typo "ToMuliDimArray()" + +- **URL:** https://github.com/SciSharp/NumSharp/issues/499 +- **State:** OPEN +- **Author:** @sappho192 +- **Created:** 2023-08-30T11:52:05Z +- **Updated:** 2024-06-12T04:11:55Z + +## Description + +Hi, recently I've been using this library and stumbled upon this method. -- **URL:** https://github.com/SciSharp/NumSharp/issues/499 -- **State:** OPEN -- **Author:** @sappho192 -- **Created:** 2023-08-30T11:52:05Z -- **Updated:** 2024-06-12T04:11:55Z +https://github.com/SciSharp/NumSharp/blob/1fed94d2e556a7fdfc815775db68f9c8f195298a/src/NumSharp.Core/Casting/NdArrayToMultiDimArray.cs#L31 -## Description - -Hi, recently I've been using this library and stumbled upon this method. - -https://github.com/SciSharp/NumSharp/blob/1fed94d2e556a7fdfc815775db68f9c8f195298a/src/NumSharp.Core/Casting/NdArrayToMultiDimArray.cs#L31 - -Is `ToMuliDimArray()` typo of `ToMultiDimArray()`? - -## Comments - -### Comment 1 by @sappho192 (2024-06-12T04:11:55Z) - -I've found that there'd been the pull request related to this #474 by @Karthick47v2 but don't know why it has been closed. +Is `ToMuliDimArray()` typo of `ToMultiDimArray()`? + +## Comments + +### Comment 1 by @sappho192 (2024-06-12T04:11:55Z) + +I've found that there'd been the pull request related to this #474 by @Karthick47v2 but don't know why it has been closed. diff --git a/docs/issues/issue-0501-memory-leak.md b/docs/issues/issue-0501-memory-leak.md index 8cc5ce19..0c4a492d 100644 --- a/docs/issues/issue-0501-memory-leak.md +++ b/docs/issues/issue-0501-memory-leak.md @@ -1,65 +1,65 @@ -# #501: Memory leak? +# #501: Memory leak? + +- **URL:** https://github.com/SciSharp/NumSharp/issues/501 +- **State:** OPEN +- **Author:** @TakuNishiumi +- **Created:** 2023-12-13T07:32:29Z +- **Updated:** 2023-12-13T07:32:29Z + +## Description + +Hi, +I tried below code and usage rate of my memory increased up to around 10GB. -- **URL:** https://github.com/SciSharp/NumSharp/issues/501 -- **State:** OPEN -- **Author:** @TakuNishiumi -- **Created:** 2023-12-13T07:32:29Z -- **Updated:** 2023-12-13T07:32:29Z +```C# +// 配列を宣言する +double[] array = new double[110]; -## Description +// 乱数を生成する +Random rnd = new Random(); -Hi, -I tried below code and usage rate of my memory increased up to around 10GB. - -```C# -// 配列を宣言する -double[] array = new double[110]; - -// 乱数を生成する -Random rnd = new Random(); - -// 配列に乱数を代入する -// make random double array -for (int i = 0; i < array.Length; i++) -{ - array[i] = rnd.NextDouble(); -} - -// make new NDarray in loop -for (int i = 0; i < 1000000; i++) -{ - NDArray array2 = np.array(array); - // NDArray array2 = np.argmin(array); also cause same trouble -} -``` -This is also caused when this is used as function. -I modified this and add GC.Collect(). -This make the code usage rate of my memory, but the calculation time increased. - -```C# -// 配列を宣言する -double[] array = new double[110]; - -// 乱数を生成する -Random rnd = new Random(); - -// 配列に乱数を代入する -// make random double array -for (int i = 0; i < array.Length; i++) -{ - array[i] = rnd.NextDouble(); -} - -// make new NDarray in loop -for (int i = 0; i < 1000000; i++) -{ - NDArray array2 = np.array(array); - if (i % 10000 == 0) - { - GC.Collect(); - } -} -``` - -What should I do next? -Do you have any ideas? +// 配列に乱数を代入する +// make random double array +for (int i = 0; i < array.Length; i++) +{ + array[i] = rnd.NextDouble(); +} + +// make new NDarray in loop +for (int i = 0; i < 1000000; i++) +{ + NDArray array2 = np.array(array); + // NDArray array2 = np.argmin(array); also cause same trouble +} +``` +This is also caused when this is used as function. +I modified this and add GC.Collect(). +This make the code usage rate of my memory, but the calculation time increased. + +```C# +// 配列を宣言する +double[] array = new double[110]; + +// 乱数を生成する +Random rnd = new Random(); + +// 配列に乱数を代入する +// make random double array +for (int i = 0; i < array.Length; i++) +{ + array[i] = rnd.NextDouble(); +} + +// make new NDarray in loop +for (int i = 0; i < 1000000; i++) +{ + NDArray array2 = np.array(array); + if (i % 10000 == 0) + { + GC.Collect(); + } +} +``` + +What should I do next? +Do you have any ideas? diff --git a/docs/issues/issue-0505-np.convolve-return-null-exception.md b/docs/issues/issue-0505-np.convolve-return-null-exception.md index 7500ee32..535f3af8 100644 --- a/docs/issues/issue-0505-np.convolve-return-null-exception.md +++ b/docs/issues/issue-0505-np.convolve-return-null-exception.md @@ -1,23 +1,23 @@ -# #505: `np.convolve` return null exception - -- **URL:** https://github.com/SciSharp/NumSharp/issues/505 -- **State:** OPEN -- **Author:** @behroozbc -- **Created:** 2023-12-25T14:42:33Z -- **Updated:** 2023-12-25T14:42:33Z - -## Description - -I am new to this repository, and I want to test a convolve funcation but I got `System.NullReferenceException: Object reference not set to an instance of an object.`. I am using the NumSharp version: 0.30.0 and .net sdk version: 8.0.100 my code is simple, which I wrote in a console app. -``` -using NumSharp; -var f = np.array(new int[] { 3, 3, 2, 1, 2 }); -var g = np.array(new int[] { -1, 2, 1 }); -var outp=np.convolve(f,g, "valid"); -Console.WriteLine(outp.ToString()); -``` -the full error message -``` -Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object. - at Program.
$(String[] args) in E:\repos\ConsoleApp7\ConsoleApp7\Program.cs:line 7 +# #505: `np.convolve` return null exception + +- **URL:** https://github.com/SciSharp/NumSharp/issues/505 +- **State:** OPEN +- **Author:** @behroozbc +- **Created:** 2023-12-25T14:42:33Z +- **Updated:** 2023-12-25T14:42:33Z + +## Description + +I am new to this repository, and I want to test a convolve funcation but I got `System.NullReferenceException: Object reference not set to an instance of an object.`. I am using the NumSharp version: 0.30.0 and .net sdk version: 8.0.100 my code is simple, which I wrote in a console app. ``` +using NumSharp; +var f = np.array(new int[] { 3, 3, 2, 1, 2 }); +var g = np.array(new int[] { -1, 2, 1 }); +var outp=np.convolve(f,g, "valid"); +Console.WriteLine(outp.ToString()); +``` +the full error message +``` +Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object. + at Program.
$(String[] args) in E:\repos\ConsoleApp7\ConsoleApp7\Program.cs:line 7 +``` diff --git a/docs/issues/issue-0506-cannot-create-an-ndarray-of-shorts.md b/docs/issues/issue-0506-cannot-create-an-ndarray-of-shorts.md index 97f7e486..de11f5f2 100644 --- a/docs/issues/issue-0506-cannot-create-an-ndarray-of-shorts.md +++ b/docs/issues/issue-0506-cannot-create-an-ndarray-of-shorts.md @@ -1,13 +1,13 @@ -# #506: Cannot create an NDArray of shorts +# #506: Cannot create an NDArray of shorts + +- **URL:** https://github.com/SciSharp/NumSharp/issues/506 +- **State:** OPEN +- **Author:** @NickBotelho +- **Created:** 2024-01-24T14:19:58Z +- **Updated:** 2024-01-24T14:19:58Z + +## Description + +When I try to initialize an NDArray with the short type, it throws a System.NotSupportedException. It seems like it only does this with shorts, every other type works fine. Heres a line of code to run to reproduce -- **URL:** https://github.com/SciSharp/NumSharp/issues/506 -- **State:** OPEN -- **Author:** @NickBotelho -- **Created:** 2024-01-24T14:19:58Z -- **Updated:** 2024-01-24T14:19:58Z - -## Description - -When I try to initialize an NDArray with the short type, it throws a System.NotSupportedException. It seems like it only does this with shorts, every other type works fine. Heres a line of code to run to reproduce - -`var nd = new NDArray(dtype: np.int16, shape: new Shape(new []{1, 2}));` +`var nd = new NDArray(dtype: np.int16, shape: new Shape(new []{1, 2}));` diff --git a/docs/issues/issue-0507-np.maximum-error.md b/docs/issues/issue-0507-np.maximum-error.md index fb6534f6..5f33ad0c 100644 --- a/docs/issues/issue-0507-np.maximum-error.md +++ b/docs/issues/issue-0507-np.maximum-error.md @@ -1,188 +1,188 @@ -# #507: np.maximum error - -- **URL:** https://github.com/SciSharp/NumSharp/issues/507 -- **State:** OPEN -- **Author:** @Thanatos0173 -- **Created:** 2024-02-16T18:29:17Z -- **Updated:** 2024-02-17T14:43:40Z - -## Description - -Hello, -I'm working on a Neural Network for the video game Celeste, and I'm using Numsharp to convert a code that a friend made, but he used python. -Currently, I'm calling a train function a huge number of time, and randomly, this error pops out : -``` -One or more errors occurred. --> at System.Threading.Tasks.Task.ThrowIfExceptional() --> at System.Threading.Tasks.Task.Wait() --> at System.Threading.Tasks.Task.Wait() --> at System.Threading.Tasks.Parallel.ForWorker[TLocal]() --> at System. Threading.Tasks. Parallel.For() --> at NumSharp. Backends. DefaultEngine.ClipNDArray() --> at NumSharp.np.maximum() -``` -I've googled it but found nothing relevant. -I don't really know if I can do a proper reproductible exemple, but if you need more informations about this error, i would be pleased to send them. - -Here is some of the code : - -```csharp - public static void TrainCommand() - { - NeuralNetwork.NeuralNetwork.Open(); - - for (int i = 0; i < Directory.GetFiles("Mia/Saves","*",SearchOption.AllDirectories).Length/2; i++) - { - var tdimarray = np.load($"Mia/Saves/ArraySaved_{i}.npy"); // 20x20 array - var tdiminput = np.load($"Mia/Saves/InputSaved_{i}.npy"); // 56x1 array - for(int j = 0; j < 10_000; j++) - { - double[] input = (double[])(Array)tdiminput[j]; - NeuralNetwork.NeuralNetwork.Train(lr, tdimarray[j], Utils.AllArrayFromOld(input )); - } - } - } -``` - -```csharp - public class FirstLayers - { - public NDArray weights; - public NDArray biases; - public NDArray inputs; - public NDArray outputNotActivated; - public NDArray output; - public NDArray outputGradient; - public FirstLayers(NDArray weights, NDArray biases) - { - this.weights = weights; - this.biases = biases; - } - - public void Forward(NDArray inputs) - { - this.inputs = inputs; - this.outputNotActivated = np.dot(inputs, this.weights) + this.biases; //np.dot - this.output = np.maximum(0, this.outputNotActivated); - } - - public void FirstLayerBackward(NDArray inputGradient, double learningRate) - { - bool one = DerivRelu(this.outputNotActivated) == null; - inputGradient = inputGradient * DerivRelu(this.outputNotActivated); - this.outputGradient = np.dot(inputGradient, this.weights.T); - this.weights -= np.dot(this.inputs.T, inputGradient) * learningRate / inputGradient.shape[0]; - this.biases -= np.mean(inputGradient, axis: 0) * learningRate; - } - - public NDArray DerivRelu(NDArray x) - { - NDArray result = np.zeros(x.Shape); - for (int i = 0; i < x.Shape[0]; i++) - { - for (int j = 0; j < x.Shape[1]; j++) - { - result[i, j] = (x[i, j].Data()[0] > 0 ? 1 : 0); - } - } - return result; - } - - } - - public class LastLayer - { - public NDArray weights; - public NDArray biases; - public NDArray inputs; - public NDArray outputGradient; - public NDArray output; - - public LastLayer(NDArray weights, NDArray biases) - { - this.weights = weights; - this.biases = biases; - } - - public void Forward(NDArray inputs) - { - this.inputs = inputs; - NDArray outputNotActivated = np.dot(inputs, this.weights) + this.biases; - NDArray expValues = np.exp(outputNotActivated - np.max(outputNotActivated, axis: 1, keepdims: true)); - this.output = expValues / np.sum(expValues.astype(NPTypeCode.Float), axis: 1, keepdims: true); - } - - public void LastLayerBackward(NDArray yPred, NDArray yTrue, double learningRate) - { - NDArray inputGradient = yPred - yTrue; - this.outputGradient = np.dot(inputGradient, this.weights.T); - this.weights -= np.dot(this.inputs.T, inputGradient) * learningRate / inputGradient.shape[0]; - this.biases -= np.mean(inputGradient, axis: 0) * learningRate; - } - } - - private static Tuple, LastLayer> nn; - - public static void Open() - { - var weights = new List (); - var biases = new List (); - foreach(string file in Directory.GetFiles("Mia/weights")) - { - weights.Add(np.load (file)); - } - foreach (string file in Directory.GetFiles("Mia/biases")) - { - biases.Add(np.load(file)); - } - - int n = weights.Count; - - nn = new Tuple, LastLayer>( - new List(), - new LastLayer(weights[n - 1], biases[n - 1])); // I gave it a new value... We'll see. - for (int j = 0; j < n - 1; j++) - { - nn.Item1.Add(new FirstLayers(weights[j], biases[j])); - } - } - - public static void Train(double lr, NDArray allTiles, int[] keypress) - { - NDArray trueInputs = allTiles.reshape(1, 400); - NDArray labels = new NDArray(keypress); - - NDArray output = ForPropagation(trueInputs); - - - BackPropagation(output, labels, lr); - - - } - public static NDArray ForPropagation(NDArray input) - { - nn.Item1[0].Forward(input); - for (int i = 1; i < nn.Item1.Count; i++) // Adding all the values inside of FirstLayer - { - nn.Item1[i].Forward(nn.Item1[i - 1].output); - } - - nn.Item2.Forward(nn.Item1[nn.Item1.Count - 1].output); - - return nn.Item2.output; - } - - public static void BackPropagation(NDArray yPred, NDArray yTrue, double lr) - { - // Your implementation for the BackPropagation function - nn.Item2.LastLayerBackward(yPred, yTrue, lr); - nn.Item1[nn.Item1.Count - 1].FirstLayerBackward(nn.Item2.outputGradient, lr); - for (int i = nn.Item1.Count - 3; i >= 0; i--) - { - nn.Item1[i].FirstLayerBackward(nn.Item1[i + 1].outputGradient, lr); - } - } - } -} - +# #507: np.maximum error + +- **URL:** https://github.com/SciSharp/NumSharp/issues/507 +- **State:** OPEN +- **Author:** @Thanatos0173 +- **Created:** 2024-02-16T18:29:17Z +- **Updated:** 2024-02-17T14:43:40Z + +## Description + +Hello, +I'm working on a Neural Network for the video game Celeste, and I'm using Numsharp to convert a code that a friend made, but he used python. +Currently, I'm calling a train function a huge number of time, and randomly, this error pops out : ``` +One or more errors occurred. +-> at System.Threading.Tasks.Task.ThrowIfExceptional() +-> at System.Threading.Tasks.Task.Wait() +-> at System.Threading.Tasks.Task.Wait() +-> at System.Threading.Tasks.Parallel.ForWorker[TLocal]() +-> at System. Threading.Tasks. Parallel.For() +-> at NumSharp. Backends. DefaultEngine.ClipNDArray() +-> at NumSharp.np.maximum() +``` +I've googled it but found nothing relevant. +I don't really know if I can do a proper reproductible exemple, but if you need more informations about this error, i would be pleased to send them. + +Here is some of the code : + +```csharp + public static void TrainCommand() + { + NeuralNetwork.NeuralNetwork.Open(); + + for (int i = 0; i < Directory.GetFiles("Mia/Saves","*",SearchOption.AllDirectories).Length/2; i++) + { + var tdimarray = np.load($"Mia/Saves/ArraySaved_{i}.npy"); // 20x20 array + var tdiminput = np.load($"Mia/Saves/InputSaved_{i}.npy"); // 56x1 array + for(int j = 0; j < 10_000; j++) + { + double[] input = (double[])(Array)tdiminput[j]; + NeuralNetwork.NeuralNetwork.Train(lr, tdimarray[j], Utils.AllArrayFromOld(input )); + } + } + } +``` + +```csharp + public class FirstLayers + { + public NDArray weights; + public NDArray biases; + public NDArray inputs; + public NDArray outputNotActivated; + public NDArray output; + public NDArray outputGradient; + public FirstLayers(NDArray weights, NDArray biases) + { + this.weights = weights; + this.biases = biases; + } + + public void Forward(NDArray inputs) + { + this.inputs = inputs; + this.outputNotActivated = np.dot(inputs, this.weights) + this.biases; //np.dot + this.output = np.maximum(0, this.outputNotActivated); + } + + public void FirstLayerBackward(NDArray inputGradient, double learningRate) + { + bool one = DerivRelu(this.outputNotActivated) == null; + inputGradient = inputGradient * DerivRelu(this.outputNotActivated); + this.outputGradient = np.dot(inputGradient, this.weights.T); + this.weights -= np.dot(this.inputs.T, inputGradient) * learningRate / inputGradient.shape[0]; + this.biases -= np.mean(inputGradient, axis: 0) * learningRate; + } + + public NDArray DerivRelu(NDArray x) + { + NDArray result = np.zeros(x.Shape); + for (int i = 0; i < x.Shape[0]; i++) + { + for (int j = 0; j < x.Shape[1]; j++) + { + result[i, j] = (x[i, j].Data()[0] > 0 ? 1 : 0); + } + } + return result; + } + + } + + public class LastLayer + { + public NDArray weights; + public NDArray biases; + public NDArray inputs; + public NDArray outputGradient; + public NDArray output; + + public LastLayer(NDArray weights, NDArray biases) + { + this.weights = weights; + this.biases = biases; + } + + public void Forward(NDArray inputs) + { + this.inputs = inputs; + NDArray outputNotActivated = np.dot(inputs, this.weights) + this.biases; + NDArray expValues = np.exp(outputNotActivated - np.max(outputNotActivated, axis: 1, keepdims: true)); + this.output = expValues / np.sum(expValues.astype(NPTypeCode.Float), axis: 1, keepdims: true); + } + + public void LastLayerBackward(NDArray yPred, NDArray yTrue, double learningRate) + { + NDArray inputGradient = yPred - yTrue; + this.outputGradient = np.dot(inputGradient, this.weights.T); + this.weights -= np.dot(this.inputs.T, inputGradient) * learningRate / inputGradient.shape[0]; + this.biases -= np.mean(inputGradient, axis: 0) * learningRate; + } + } + + private static Tuple, LastLayer> nn; + + public static void Open() + { + var weights = new List (); + var biases = new List (); + foreach(string file in Directory.GetFiles("Mia/weights")) + { + weights.Add(np.load (file)); + } + foreach (string file in Directory.GetFiles("Mia/biases")) + { + biases.Add(np.load(file)); + } + + int n = weights.Count; + + nn = new Tuple, LastLayer>( + new List(), + new LastLayer(weights[n - 1], biases[n - 1])); // I gave it a new value... We'll see. + for (int j = 0; j < n - 1; j++) + { + nn.Item1.Add(new FirstLayers(weights[j], biases[j])); + } + } + + public static void Train(double lr, NDArray allTiles, int[] keypress) + { + NDArray trueInputs = allTiles.reshape(1, 400); + NDArray labels = new NDArray(keypress); + + NDArray output = ForPropagation(trueInputs); + + + BackPropagation(output, labels, lr); + + + } + public static NDArray ForPropagation(NDArray input) + { + nn.Item1[0].Forward(input); + for (int i = 1; i < nn.Item1.Count; i++) // Adding all the values inside of FirstLayer + { + nn.Item1[i].Forward(nn.Item1[i - 1].output); + } + + nn.Item2.Forward(nn.Item1[nn.Item1.Count - 1].output); + + return nn.Item2.output; + } + + public static void BackPropagation(NDArray yPred, NDArray yTrue, double lr) + { + // Your implementation for the BackPropagation function + nn.Item2.LastLayerBackward(yPred, yTrue, lr); + nn.Item1[nn.Item1.Count - 1].FirstLayerBackward(nn.Item2.outputGradient, lr); + for (int i = nn.Item1.Count - 3; i >= 0; i--) + { + nn.Item1[i].FirstLayerBackward(nn.Item1[i + 1].outputGradient, lr); + } + } + } +} + +``` diff --git a/docs/issues/issue-0508-np.hstack-has-diffrent-effect-from-python.md b/docs/issues/issue-0508-np.hstack-has-diffrent-effect-from-python.md index 121e0a8a..3af08b86 100644 --- a/docs/issues/issue-0508-np.hstack-has-diffrent-effect-from-python.md +++ b/docs/issues/issue-0508-np.hstack-has-diffrent-effect-from-python.md @@ -1,54 +1,54 @@ -# #508: np.hstack has diffrent effect from python +# #508: np.hstack has diffrent effect from python + +- **URL:** https://github.com/SciSharp/NumSharp/issues/508 +- **State:** OPEN +- **Author:** @xdqa01 +- **Created:** 2024-02-17T08:19:50Z +- **Updated:** 2024-02-18T00:28:53Z + +## Description + +Windows 10@19044.2364 +Dotnet@net8.0-windows,wpf +NumSharp@0.30.0 +OpenCvSharp4@4.9.0.20240103 +Python@3.12 -- **URL:** https://github.com/SciSharp/NumSharp/issues/508 -- **State:** OPEN -- **Author:** @xdqa01 -- **Created:** 2024-02-17T08:19:50Z -- **Updated:** 2024-02-18T00:28:53Z -## Description +NumSharp np.hstack(img1,img2,img3) +```csharp + var image1 = Cv2.ImRead(FirstImagePath).NotNull().ResizeToStandardSize(); + var image2 = Cv2.ImRead(SecondImagePath).NotNull().ResizeToStandardSize(); + var image3 = Cv2.ImRead(ThirdImagePath).NotNull().ResizeToStandardSize(); + var imageArray = np.hstack(image1.ToNDArray(), image2.ToNDArray(), image3.ToNDArray()); + var image = imageArray.ToMat(); + Cv2.ImShow(WindowName, image); + FourthImageSource = image.ToBitmapSource(); +``` -Windows 10@19044.2364 -Dotnet@net8.0-windows,wpf -NumSharp@0.30.0 -OpenCvSharp4@4.9.0.20240103 -Python@3.12 - - -NumSharp np.hstack(img1,img2,img3) -```csharp - var image1 = Cv2.ImRead(FirstImagePath).NotNull().ResizeToStandardSize(); - var image2 = Cv2.ImRead(SecondImagePath).NotNull().ResizeToStandardSize(); - var image3 = Cv2.ImRead(ThirdImagePath).NotNull().ResizeToStandardSize(); - var imageArray = np.hstack(image1.ToNDArray(), image2.ToNDArray(), image3.ToNDArray()); - var image = imageArray.ToMat(); - Cv2.ImShow(WindowName, image); - FourthImageSource = image.ToBitmapSource(); -``` - -print -- img1 -- img2 -- img3 - -python np.hstack(img1,img2,img3) -```python - img1 = cv.imread("./static/fllower.jpg") - img2 = cv.imread("./static/lake.jpg") - img3 = cv.imread("./static/mountain.jpg") - img1 = cv.resize(img1, (200, 200)) - img2 = cv.resize(img2, (200, 200)) - img3 = cv.resize(img3, (200, 200)) - imgs = np.hstack([img1, img2, img3]) - cv.imshow("multi_pic", imgs) -``` - -print -img1 img2 img3 - - -And,if i use code below,it print like python np.hstack -```csharp -var imageArray = np.dstack(image1.ToNDArray(), image2.ToNDArray(), image3.ToNDArray()); -``` +print +- img1 +- img2 +- img3 +python np.hstack(img1,img2,img3) +```python + img1 = cv.imread("./static/fllower.jpg") + img2 = cv.imread("./static/lake.jpg") + img3 = cv.imread("./static/mountain.jpg") + img1 = cv.resize(img1, (200, 200)) + img2 = cv.resize(img2, (200, 200)) + img3 = cv.resize(img3, (200, 200)) + imgs = np.hstack([img1, img2, img3]) + cv.imshow("multi_pic", imgs) +``` + +print +img1 img2 img3 + + +And,if i use code below,it print like python np.hstack +```csharp +var imageArray = np.dstack(image1.ToNDArray(), image2.ToNDArray(), image3.ToNDArray()); +``` + diff --git a/docs/issues/issue-0509-extremely-poor-performance-on-sum-reduce.md b/docs/issues/issue-0509-extremely-poor-performance-on-sum-reduce.md index e2893810..5465b16c 100644 --- a/docs/issues/issue-0509-extremely-poor-performance-on-sum-reduce.md +++ b/docs/issues/issue-0509-extremely-poor-performance-on-sum-reduce.md @@ -1,92 +1,92 @@ -# #509: Extremely poor performance on sum reduce +# #509: Extremely poor performance on sum reduce + +- **URL:** https://github.com/SciSharp/NumSharp/issues/509 +- **State:** OPEN +- **Author:** @lucdem +- **Created:** 2024-02-19T23:32:37Z +- **Updated:** 2024-03-27T04:09:12Z + +## Description + +Creating a large 3 dimensional array and calling sum(axis: 0) takes an enormous amount of time on my machine (11s), far more than Numpy (around 75ms) or even just a simple C# naive implementation (around 200ms). -- **URL:** https://github.com/SciSharp/NumSharp/issues/509 -- **State:** OPEN -- **Author:** @lucdem -- **Created:** 2024-02-19T23:32:37Z -- **Updated:** 2024-03-27T04:09:12Z +C# Code: -## Description +``` +using NumSharp; +using System.Diagnostics; +using System.Linq; + +namespace NumSharpTest; + +internal class Program +{ + static void Main(string[] args) + { + Console.WriteLine("NumSharp"); + NumSharp(); + Console.WriteLine("#######################"); + Console.WriteLine("Naive"); + Naive(); + } + + static void NumSharp() + { + var randArr = np.random.uniform(0, 1, [500, 500, 500]).astype(np.float32); + + var stopwatch = new Stopwatch(); + stopwatch.Start(); + var linesSum = randArr.sum(axis: 0); + stopwatch.Stop(); + Console.WriteLine($"Elapsed: {stopwatch.ElapsedMilliseconds} ms"); + } + + static void Naive() + { + var random = new Random(); + var shape = new int[] { 500, 500, 500 }; + var randArr = new float[shape[0] * shape[1] * shape[2]]; + for (int i = 0; i < randArr.Length; i++) { randArr[i] = (float)random.NextDouble(); } + + var stopwatch = new Stopwatch(); + stopwatch.Start(); + var sum = new float[shape[1] * shape[2]]; + for (int i = 0; i < shape[0]; i++) + { + for (int j = 0; j < shape[1]; j++) + { + for (int k = 0; k < shape[2]; k++) + { + sum[shape[2] * j + k] += randArr[shape[1] * shape[2] * i + shape[2] * j + k]; + } + } + } + stopwatch.Stop(); + Console.WriteLine($"Elapsed: {stopwatch.ElapsedMilliseconds} ms"); + } +} + + +``` + +Python Code: -Creating a large 3 dimensional array and calling sum(axis: 0) takes an enormous amount of time on my machine (11s), far more than Numpy (around 75ms) or even just a simple C# naive implementation (around 200ms). - -C# Code: - -``` -using NumSharp; -using System.Diagnostics; -using System.Linq; - -namespace NumSharpTest; - -internal class Program -{ - static void Main(string[] args) - { - Console.WriteLine("NumSharp"); - NumSharp(); - Console.WriteLine("#######################"); - Console.WriteLine("Naive"); - Naive(); - } - - static void NumSharp() - { - var randArr = np.random.uniform(0, 1, [500, 500, 500]).astype(np.float32); - - var stopwatch = new Stopwatch(); - stopwatch.Start(); - var linesSum = randArr.sum(axis: 0); - stopwatch.Stop(); - Console.WriteLine($"Elapsed: {stopwatch.ElapsedMilliseconds} ms"); - } - - static void Naive() - { - var random = new Random(); - var shape = new int[] { 500, 500, 500 }; - var randArr = new float[shape[0] * shape[1] * shape[2]]; - for (int i = 0; i < randArr.Length; i++) { randArr[i] = (float)random.NextDouble(); } - - var stopwatch = new Stopwatch(); - stopwatch.Start(); - var sum = new float[shape[1] * shape[2]]; - for (int i = 0; i < shape[0]; i++) - { - for (int j = 0; j < shape[1]; j++) - { - for (int k = 0; k < shape[2]; k++) - { - sum[shape[2] * j + k] += randArr[shape[1] * shape[2] * i + shape[2] * j + k]; - } - } - } - stopwatch.Stop(); - Console.WriteLine($"Elapsed: {stopwatch.ElapsedMilliseconds} ms"); - } -} - - -``` - -Python Code: - -``` -import numpy as np -from time import time - -randArr = np.random.normal(1, 0.5, (500, 500, 500)) - -start = time() -sum = randArr.sum(axis=0) -end = time() - -print(f'Elapsed: {(end - start) * 1000} ms') ``` +import numpy as np +from time import time -## Comments +randArr = np.random.normal(1, 0.5, (500, 500, 500)) -### Comment 1 by @vkribo (2024-03-27T04:09:11Z) +start = time() +sum = randArr.sum(axis=0) +end = time() -I profiled it and the problem seems to be in the method GetOffset in the Shape class. In the method there is a list called coords being created milions of times. I tried reimplementing it using a stackalloced array instead and it went from 6287 ms to 2315 ms. -Maybe someone more familliar with the code could look into it. +print(f'Elapsed: {(end - start) * 1000} ms') +``` + +## Comments + +### Comment 1 by @vkribo (2024-03-27T04:09:11Z) + +I profiled it and the problem seems to be in the method GetOffset in the Shape class. In the method there is a list called coords being created milions of times. I tried reimplementing it using a stackalloced array instead and it went from 6287 ms to 2315 ms. +Maybe someone more familliar with the code could look into it. diff --git a/docs/issues/issue-0510-how-to-save-a-nested-dictionary-with-save-npz.md b/docs/issues/issue-0510-how-to-save-a-nested-dictionary-with-save-npz.md index 10bb76d3..8346bcab 100644 --- a/docs/issues/issue-0510-how-to-save-a-nested-dictionary-with-save-npz.md +++ b/docs/issues/issue-0510-how-to-save-a-nested-dictionary-with-save-npz.md @@ -1,25 +1,25 @@ -# #510: How to save a nested dictionary with `save_npz` - -- **URL:** https://github.com/SciSharp/NumSharp/issues/510 -- **State:** OPEN -- **Author:** @rqx110 -- **Created:** 2024-03-07T01:20:45Z -- **Updated:** 2024-03-07T01:20:45Z - -## Description - -If i have a data struct like: -```json -{ - "port1": { - "time": ["xxxx", "yyyy"], - "data": [0.0, 0.0] - }, - "port2": { - "time": ["xxxx", "yyyy"], - "data": [0.0, 0.0] - }, -} -``` -how to save it with `save_npz`? -can you give same sample codes? Thanks! +# #510: How to save a nested dictionary with `save_npz` + +- **URL:** https://github.com/SciSharp/NumSharp/issues/510 +- **State:** OPEN +- **Author:** @rqx110 +- **Created:** 2024-03-07T01:20:45Z +- **Updated:** 2024-03-07T01:20:45Z + +## Description + +If i have a data struct like: +```json +{ + "port1": { + "time": ["xxxx", "yyyy"], + "data": [0.0, 0.0] + }, + "port2": { + "time": ["xxxx", "yyyy"], + "data": [0.0, 0.0] + }, +} +``` +how to save it with `save_npz`? +can you give same sample codes? Thanks! diff --git a/docs/issues/issue-0511-does-numsharp-work-in-unity-with-the-il2cpp-backend.md b/docs/issues/issue-0511-does-numsharp-work-in-unity-with-the-il2cpp-backend.md index 04176677..60c6c2d5 100644 --- a/docs/issues/issue-0511-does-numsharp-work-in-unity-with-the-il2cpp-backend.md +++ b/docs/issues/issue-0511-does-numsharp-work-in-unity-with-the-il2cpp-backend.md @@ -1,13 +1,13 @@ -# #511: Does Numsharp work in Unity with the IL2CPP backend? - -- **URL:** https://github.com/SciSharp/NumSharp/issues/511 -- **State:** OPEN -- **Author:** @jacob-jacob-jacob -- **Created:** 2024-03-27T15:28:35Z -- **Updated:** 2024-03-27T15:28:35Z - -## Description - -In the following thread there is some nice advice on how to set up Numsharp in unity: -https://github.com/SciSharp/NumSharp/issues/353 -However, I've been asking myself if people have tested its performance. I reccon that it should work well with the Unitys Mono backend, but will it also have relatively good performance if choosing the IL2CPP backend? +# #511: Does Numsharp work in Unity with the IL2CPP backend? + +- **URL:** https://github.com/SciSharp/NumSharp/issues/511 +- **State:** OPEN +- **Author:** @jacob-jacob-jacob +- **Created:** 2024-03-27T15:28:35Z +- **Updated:** 2024-03-27T15:28:35Z + +## Description + +In the following thread there is some nice advice on how to set up Numsharp in unity: +https://github.com/SciSharp/NumSharp/issues/353 +However, I've been asking myself if people have tested its performance. I reccon that it should work well with the Unitys Mono backend, but will it also have relatively good performance if choosing the IL2CPP backend? diff --git a/docs/issues/issue-0512-how-to-change-to-microsoft.ml.onnxruntime.tensors.densetensor-float.md b/docs/issues/issue-0512-how-to-change-to-microsoft.ml.onnxruntime.tensors.densetensor-float.md index fabb37bb..60fe5829 100644 --- a/docs/issues/issue-0512-how-to-change-to-microsoft.ml.onnxruntime.tensors.densetensor-float.md +++ b/docs/issues/issue-0512-how-to-change-to-microsoft.ml.onnxruntime.tensors.densetensor-float.md @@ -1,26 +1,26 @@ -# #512: how to change to Microsoft.ML.OnnxRuntime.Tensors.DenseTensor? +# #512: how to change to Microsoft.ML.OnnxRuntime.Tensors.DenseTensor? + +- **URL:** https://github.com/SciSharp/NumSharp/issues/512 +- **State:** OPEN +- **Author:** @BingGitCn +- **Created:** 2024-04-01T09:13:01Z +- **Updated:** 2024-04-01T09:13:01Z + +## Description + + public static void ExtractPixelsArgb(DenseTensor tensor, Span data, int pixelCount) + { + Span spanR = tensor.Buffer.Span; + Span spanG = spanR[pixelCount..]; + Span spanB = spanG[pixelCount..]; -- **URL:** https://github.com/SciSharp/NumSharp/issues/512 -- **State:** OPEN -- **Author:** @BingGitCn -- **Created:** 2024-04-01T09:13:01Z -- **Updated:** 2024-04-01T09:13:01Z - -## Description - - public static void ExtractPixelsArgb(DenseTensor tensor, Span data, int pixelCount) - { - Span spanR = tensor.Buffer.Span; - Span spanG = spanR[pixelCount..]; - Span spanB = spanG[pixelCount..]; - - int sidx = 0; - for (int i = 0; i < pixelCount; i++) - { - spanR[i] = data[sidx + 2] * 0.0039215686274509803921568627451f; - spanG[i] = data[sidx + 1] * 0.0039215686274509803921568627451f; - spanB[i] = data[sidx] * 0.0039215686274509803921568627451f; - sidx += 4; - } - } -Is there a faster way than this? + int sidx = 0; + for (int i = 0; i < pixelCount; i++) + { + spanR[i] = data[sidx + 2] * 0.0039215686274509803921568627451f; + spanG[i] = data[sidx + 1] * 0.0039215686274509803921568627451f; + spanB[i] = data[sidx] * 0.0039215686274509803921568627451f; + sidx += 4; + } + } +Is there a faster way than this? diff --git a/docs/issues/issue-0514-setitem-for-multiple-ids-not-working.md b/docs/issues/issue-0514-setitem-for-multiple-ids-not-working.md index b161af37..9e357aa4 100644 --- a/docs/issues/issue-0514-setitem-for-multiple-ids-not-working.md +++ b/docs/issues/issue-0514-setitem-for-multiple-ids-not-working.md @@ -1,41 +1,41 @@ -# #514: SetItem for multiple Ids not working - -- **URL:** https://github.com/SciSharp/NumSharp/issues/514 -- **State:** OPEN -- **Author:** @MaxOmlor -- **Created:** 2024-06-03T07:57:24Z -- **Updated:** 2024-06-03T07:57:24Z - -## Description - -```C# -[Test] - public void MultiIdSetItem() - { - var a = np.arange(5); - Debug.Log($"a = {a}"); - var ids = np.array(new int[] { 1, 3 }); - Debug.Log($"ids = {ids}"); - var newValues = np.array(new int[] { 10, 20 }); - Debug.Log($"newValues = {newValues}"); - - a[ids] = newValues; - Debug.Log($"after set item: a = {a}"); - - var expected = np.array(new[] { 0, 10, 2, 20, 4 }); - Assert.AreEqual(expected, a); - } -``` -Output: -``` -Expected and actual are both - Values differ at index [1] - Expected: 10 - But was: 1 ---- -a = [0, 1, 2, 3, 4] -ids = [1, 3] -newValues = [10, 20] -after set item: a = [0, 1, 2, 3, 4] -``` +# #514: SetItem for multiple Ids not working + +- **URL:** https://github.com/SciSharp/NumSharp/issues/514 +- **State:** OPEN +- **Author:** @MaxOmlor +- **Created:** 2024-06-03T07:57:24Z +- **Updated:** 2024-06-03T07:57:24Z + +## Description + +```C# +[Test] + public void MultiIdSetItem() + { + var a = np.arange(5); + Debug.Log($"a = {a}"); + var ids = np.array(new int[] { 1, 3 }); + Debug.Log($"ids = {ids}"); + var newValues = np.array(new int[] { 10, 20 }); + Debug.Log($"newValues = {newValues}"); + a[ids] = newValues; + Debug.Log($"after set item: a = {a}"); + + var expected = np.array(new[] { 0, 10, 2, 20, 4 }); + Assert.AreEqual(expected, a); + } +``` +Output: +``` +Expected and actual are both + Values differ at index [1] + Expected: 10 + But was: 1 +--- +a = [0, 1, 2, 3, 4] +ids = [1, 3] +newValues = [10, 20] +after set item: a = [0, 1, 2, 3, 4] +``` + diff --git a/docs/issues/issue-0517-error-when-loading-a-.npy-file-containing-a-scalar-value.md b/docs/issues/issue-0517-error-when-loading-a-.npy-file-containing-a-scalar-value.md index d3541897..7a86bdf3 100644 --- a/docs/issues/issue-0517-error-when-loading-a-.npy-file-containing-a-scalar-value.md +++ b/docs/issues/issue-0517-error-when-loading-a-.npy-file-containing-a-scalar-value.md @@ -1,12 +1,12 @@ -# #517: Error when loading a `.npy` file containing a scalar value - -- **URL:** https://github.com/SciSharp/NumSharp/issues/517 -- **State:** OPEN -- **Author:** @thalesfm -- **Created:** 2024-09-24T17:56:29Z -- **Updated:** 2024-09-24T17:56:29Z - -## Description - -Due to an off-by-one error, `np.load` fails to parse the file's header when `shape = ()` and triggers an `ArgumentOutOfRangeException` -(Also, the function doesn't consider this possibility when calculating the size of the underlying buffer). +# #517: Error when loading a `.npy` file containing a scalar value + +- **URL:** https://github.com/SciSharp/NumSharp/issues/517 +- **State:** OPEN +- **Author:** @thalesfm +- **Created:** 2024-09-24T17:56:29Z +- **Updated:** 2024-09-24T17:56:29Z + +## Description + +Due to an off-by-one error, `np.load` fails to parse the file's header when `shape = ()` and triggers an `ArgumentOutOfRangeException` +(Also, the function doesn't consider this possibility when calculating the size of the underlying buffer). diff --git a/docs/issues/issue-0519-bug-ndarray-filted-array-ori-array-max-prob-conf-threshold.md b/docs/issues/issue-0519-bug-ndarray-filted-array-ori-array-max-prob-conf-threshold.md index 2e0b5d73..805a0661 100644 --- a/docs/issues/issue-0519-bug-ndarray-filted-array-ori-array-max-prob-conf-threshold.md +++ b/docs/issues/issue-0519-bug-ndarray-filted-array-ori-array-max-prob-conf-threshold.md @@ -1,18 +1,18 @@ -# #519: BUG: NDArray filted_array = ori_array[max_prob > conf_threshold]; +# #519: BUG: NDArray filted_array = ori_array[max_prob > conf_threshold]; + +- **URL:** https://github.com/SciSharp/NumSharp/issues/519 +- **State:** OPEN +- **Author:** @1Zengy +- **Created:** 2024-11-11T09:09:51Z +- **Updated:** 2024-11-11T09:09:51Z + +## Description + +In the C# code, NDArray filted_array = ori_array[max_prob > conf_threshold]; +Here, `ori_array` is an `NDArray` with a shape of [1, 8400, 5], where 5 represents the five probabilities of 5 classes. `max_prob` is an `NDArray` with a shape of [1, 8400], indicating the maximum probability among the 5 classes. `conf_threshold` is a float value which represents the threshold of probability. -- **URL:** https://github.com/SciSharp/NumSharp/issues/519 -- **State:** OPEN -- **Author:** @1Zengy -- **Created:** 2024-11-11T09:09:51Z -- **Updated:** 2024-11-11T09:09:51Z - -## Description - -In the C# code, NDArray filted_array = ori_array[max_prob > conf_threshold]; -Here, `ori_array` is an `NDArray` with a shape of [1, 8400, 5], where 5 represents the five probabilities of 5 classes. `max_prob` is an `NDArray` with a shape of [1, 8400], indicating the maximum probability among the 5 classes. `conf_threshold` is a float value which represents the threshold of probability. - -I would like to delete the objects in the 8400 dimension where the maximum probability is lower than the `conf_threshold`. However, even though I have ensured that `ori_array` and `max_prob` have the same values, the code will randomly return either an exact value with a shape of [n, 5] or a null value with a shape of [0, 5]. Here is my data saved using "np.save()". -[ori_array.json](https://github.com/user-attachments/files/17699927/ori_array.json) -[max_prob.json](https://github.com/user-attachments/files/17699931/max_prob.json) - +I would like to delete the objects in the 8400 dimension where the maximum probability is lower than the `conf_threshold`. However, even though I have ensured that `ori_array` and `max_prob` have the same values, the code will randomly return either an exact value with a shape of [n, 5] or a null value with a shape of [0, 5]. Here is my data saved using "np.save()". +[ori_array.json](https://github.com/user-attachments/files/17699927/ori_array.json) +[max_prob.json](https://github.com/user-attachments/files/17699931/max_prob.json) + diff --git a/src/NumSharp.Core/NumSharp.Core.csproj b/src/NumSharp.Core/NumSharp.Core.csproj index 60dd5c11..9bcd97d0 100644 --- a/src/NumSharp.Core/NumSharp.Core.csproj +++ b/src/NumSharp.Core/NumSharp.Core.csproj @@ -1,88 +1,88 @@ - - - net8.0;net10.0 - true - true - Eli Belash, Haiping Chen, Meinrad Recheis, Deepak Kumar Battini - ../../packages - NumSharp is the fundamental library for scientific computing with .NET providing a similar API to python's numpy scientific library. NumSharp has full N-D, broadcasting and axis support. If you want to use .NET to get started with machine learning, NumSharp will be your best tool. - https://github.com/SciSharp - 2021 © SciSharp STACK Team - https://github.com/SciSharp/NumSharp - - 0.40.0 - 0.40.0 - git - Numpy, NumSharp, MachineLearning, Math, Scientific, Numeric, Mathlab, SciSharp - - latest - https://avatars3.githubusercontent.com/u/44989469?s=200&v=4 - NumSharp - NumSharp - SciSharp STACK - NumSharp - 0.40.0 - $(Version)-$(VersionSuffix) - true - Open.snk - $(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb - AnyCPU - LICENSE - false - Debug;Release;Publish - NumSharp - 0.40.0 - true - - - - true - true - - - - - - - - - - - - - - - - - - - - - True - - - - - - - - - - - - - - - - - - - - - - - - - - + + + net8.0;net10.0 + true + true + Eli Belash, Haiping Chen, Meinrad Recheis, Deepak Kumar Battini + ../../packages + NumSharp is the fundamental library for scientific computing with .NET providing a similar API to python's numpy scientific library. NumSharp has full N-D, broadcasting and axis support. If you want to use .NET to get started with machine learning, NumSharp will be your best tool. + https://github.com/SciSharp + 2021 © SciSharp STACK Team + https://github.com/SciSharp/NumSharp + + 0.40.0 + 0.40.0 + git + Numpy, NumSharp, MachineLearning, Math, Scientific, Numeric, Mathlab, SciSharp + + latest + https://avatars3.githubusercontent.com/u/44989469?s=200&v=4 + NumSharp + NumSharp + SciSharp STACK + NumSharp + 0.40.0 + $(Version)-$(VersionSuffix) + true + Open.snk + $(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb + AnyCPU + LICENSE + false + Debug;Release;Publish + NumSharp + 0.40.0 + true + + + + true + true + + + + + + + + + + + + + + + + + + + + + True + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/NumSharp.Benchmark/NumSharp.Benchmark.csproj b/test/NumSharp.Benchmark/NumSharp.Benchmark.csproj index 0a1e29e2..af1bdf41 100644 --- a/test/NumSharp.Benchmark/NumSharp.Benchmark.csproj +++ b/test/NumSharp.Benchmark/NumSharp.Benchmark.csproj @@ -1,32 +1,32 @@ - - - - Exe - net8.0;net10.0 - latest - AnyCPU;x64 - - - true - Open.snk - Debug;Release;Publish - true - - - - - - - - - - - - - - - - - - - + + + + Exe + net8.0;net10.0 + latest + AnyCPU;x64 + + + true + Open.snk + Debug;Release;Publish + true + + + + + + + + + + + + + + + + + + + diff --git a/test/NumSharp.UnitTest/NumSharp.UnitTest.csproj b/test/NumSharp.UnitTest/NumSharp.UnitTest.csproj index 18effd2d..ab895134 100644 --- a/test/NumSharp.UnitTest/NumSharp.UnitTest.csproj +++ b/test/NumSharp.UnitTest/NumSharp.UnitTest.csproj @@ -1,79 +1,79 @@ - - - - - - net10.0 - Exe - false - true - latest - AnyCPU - Open.snk - Debug;Release;Publish - false - - - - - true - true - SIGNING - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - PreserveNewest - - - - - - - - - - - - - - - Never - - - Never - - - Never - - - Never - - - + + + + + + net10.0 + Exe + false + true + latest + AnyCPU + Open.snk + Debug;Release;Publish + false + + + + + true + true + SIGNING + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PreserveNewest + + + + + + + + + + + + + + + Never + + + Never + + + Never + + + Never + + + From c8ddfd65a08e207f9df1b3fd50bccf767e0a127b Mon Sep 17 00:00:00 2001 From: Eli Belash Date: Sat, 21 Feb 2026 16:03:30 +0200 Subject: [PATCH 12/15] refactor: modernize allocation with NativeMemory API (#528) Replace deprecated Marshal.AllocHGlobal/FreeHGlobal with the modern .NET 6+ NativeMemory.Alloc/Free API. Benchmarks confirmed identical performance (within noise margin). Co-Authored-By: Claude Opus 4.6 --- .../Backends/Unmanaged/Pooling/StackedMemoryPool.cs | 12 ++++++------ .../Backends/Unmanaged/UnmanagedMemoryBlock`1.cs | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/NumSharp.Core/Backends/Unmanaged/Pooling/StackedMemoryPool.cs b/src/NumSharp.Core/Backends/Unmanaged/Pooling/StackedMemoryPool.cs index c3ee779a..f832e0fe 100644 --- a/src/NumSharp.Core/Backends/Unmanaged/Pooling/StackedMemoryPool.cs +++ b/src/NumSharp.Core/Backends/Unmanaged/Pooling/StackedMemoryPool.cs @@ -78,7 +78,7 @@ public StackedMemoryPool(int singleSize, int count) } - public IntPtr Take() + public unsafe IntPtr Take() { lock (this) { @@ -87,7 +87,7 @@ public IntPtr Take() if (availables_blocks.Count != 0) return availables_blocks.Pop(); - var ret = Marshal.AllocHGlobal(SingleSize); + var ret = (IntPtr)NativeMemory.Alloc((nuint)SingleSize); individualyAllocated.Add(ret); _totalCount += 1; return ret; @@ -146,7 +146,7 @@ private void _runGC(int delay, int restarts = 0) _gcTimer = new System.Threading.Timer(state => CollectGarbage((GCContext)state), new GCContext(availables.Count, restarts), delay, -1); } - private void CollectGarbage(GCContext ctx) + private unsafe void CollectGarbage(GCContext ctx) { lock (this) { @@ -166,7 +166,7 @@ private void CollectGarbage(GCContext ctx) var addr = availables.Pop(); Debug.Assert(individualyAllocated.Contains(addr), "individualyAllocated.Contains(addr)"); individualyAllocated.Remove(addr); - Marshal.FreeHGlobal(addr); + NativeMemory.Free((void*)addr); } availables.TrimExcess(); @@ -227,7 +227,7 @@ public void UpdateGarbageCollectionThreshold() _originalTotalsThreshold = unchecked((int)Math.Min((_totalCount * 1.333f), int.MaxValue)); } - private void ReleaseUnmanagedResources() + private unsafe void ReleaseUnmanagedResources() { lock (this) { @@ -235,7 +235,7 @@ private void ReleaseUnmanagedResources() availables.Clear(); availables_blocks.Clear(); - individualyAllocated.ForEach(Marshal.FreeHGlobal); + individualyAllocated.ForEach(ptr => NativeMemory.Free((void*)ptr)); individualyAllocated.Clear(); } } diff --git a/src/NumSharp.Core/Backends/Unmanaged/UnmanagedMemoryBlock`1.cs b/src/NumSharp.Core/Backends/Unmanaged/UnmanagedMemoryBlock`1.cs index fc1414a3..833400dc 100644 --- a/src/NumSharp.Core/Backends/Unmanaged/UnmanagedMemoryBlock`1.cs +++ b/src/NumSharp.Core/Backends/Unmanaged/UnmanagedMemoryBlock`1.cs @@ -28,7 +28,7 @@ public unsafe struct UnmanagedMemoryBlock : IUnmanagedMemoryBlock, IMemoryBlo public UnmanagedMemoryBlock(long count) { var bytes = BytesCount = count * InfoOf.Size; - var ptr = Marshal.AllocHGlobal(new IntPtr(bytes)); + var ptr = (IntPtr)NativeMemory.Alloc((nuint)bytes); _disposer = new Disposer(ptr); Address = (T*)ptr; Count = count; @@ -992,7 +992,7 @@ private void ReleaseUnmanagedResources() switch (_type) { case AllocationType.AllocHGlobal: - Marshal.FreeHGlobal(Address); + NativeMemory.Free((void*)Address); return; case AllocationType.Wrap: return; From 81b57d38c9ed22d35ffb4bccb0ffdbbdc4bb7913 Mon Sep 17 00:00:00 2001 From: Eli Belash Date: Sat, 21 Feb 2026 16:06:56 +0200 Subject: [PATCH 13/15] refactor: split ILKernelGenerator.cs into partial classes Split the 5,183-line ILKernelGenerator.cs into 6 focused partial class files: - ILKernelGenerator.cs (507 lines): Core constants, vector helpers, NPTypeCode IL helpers - ILKernelGenerator.Binary.cs (443 lines): Binary same-type operations - ILKernelGenerator.MixedType.cs (1,064 lines): Mixed-type binary operations - ILKernelGenerator.Unary.cs (1,199 lines): Unary operations + scalar kernels - ILKernelGenerator.Comparison.cs (964 lines): Comparison operations - ILKernelGenerator.Reduction.cs (1,073 lines): Reduction operations This improves maintainability by organizing code by kernel type. Co-Authored-By: Claude Opus 4.6 --- .../Kernels/ILKernelGenerator.Binary.cs | 443 ++ .../Kernels/ILKernelGenerator.Comparison.cs | 964 ++++ .../Kernels/ILKernelGenerator.MixedType.cs | 1064 ++++ .../Kernels/ILKernelGenerator.Reduction.cs | 1073 ++++ .../Kernels/ILKernelGenerator.Unary.cs | 1199 ++++ .../Backends/Kernels/ILKernelGenerator.cs | 4936 ++--------------- 6 files changed, 5053 insertions(+), 4626 deletions(-) create mode 100644 src/NumSharp.Core/Backends/Kernels/ILKernelGenerator.Binary.cs create mode 100644 src/NumSharp.Core/Backends/Kernels/ILKernelGenerator.Comparison.cs create mode 100644 src/NumSharp.Core/Backends/Kernels/ILKernelGenerator.MixedType.cs create mode 100644 src/NumSharp.Core/Backends/Kernels/ILKernelGenerator.Reduction.cs create mode 100644 src/NumSharp.Core/Backends/Kernels/ILKernelGenerator.Unary.cs diff --git a/src/NumSharp.Core/Backends/Kernels/ILKernelGenerator.Binary.cs b/src/NumSharp.Core/Backends/Kernels/ILKernelGenerator.Binary.cs new file mode 100644 index 00000000..987e2e70 --- /dev/null +++ b/src/NumSharp.Core/Backends/Kernels/ILKernelGenerator.Binary.cs @@ -0,0 +1,443 @@ +using System; +using System.Collections.Concurrent; +using System.Linq; +using System.Reflection; +using System.Reflection.Emit; +using System.Runtime.CompilerServices; +using System.Runtime.Intrinsics; + +namespace NumSharp.Backends.Kernels +{ + /// + /// Binary operations (same-type) - contiguous kernels and generic helpers. + /// + public static partial class ILKernelGenerator + { + /// + /// Cache of IL-generated contiguous kernels. + /// Key: (Operation, Type) + /// + private static readonly ConcurrentDictionary<(BinaryOp, Type), Delegate> _contiguousKernelCache = new(); + + /// + /// Number of IL-generated kernels in cache. + /// + public static int CachedCount => _contiguousKernelCache.Count; + + /// + /// Clear the contiguous kernel cache. + /// + public static void Clear() => _contiguousKernelCache.Clear(); + + #region Public API + + /// + /// Get or generate an IL-based kernel for contiguous (SimdFull) operations. + /// Returns null if IL generation is not supported for this type/operation. + /// + public static ContiguousKernel? GetContiguousKernel(BinaryOp op) where T : unmanaged + { + if (!Enabled) + return null; + + var key = (op, typeof(T)); + + // Check cache first + if (_contiguousKernelCache.TryGetValue(key, out var cached)) + return (ContiguousKernel)cached; + + // Generate new kernel + var kernel = TryGenerateContiguousKernel(op); + if (kernel == null) + return null; + + // Try to add to cache; if another thread added first, use theirs + if (_contiguousKernelCache.TryAdd(key, kernel)) + return kernel; + + // Another thread beat us - return the cached version + return (ContiguousKernel)_contiguousKernelCache[key]; + } + + /// + /// Generate a full unified kernel that handles all execution paths. + /// Uses IL-generated code for hot paths, falls back to C# for others. + /// + public static BinaryKernel? GenerateUnifiedKernel(BinaryOp op) where T : unmanaged + { + if (!Enabled) + return null; + + // Get the IL-generated contiguous kernel + var contiguousKernel = GetContiguousKernel(op); + if (contiguousKernel == null) + return null; + + // Create a wrapper that dispatches based on strides + return CreateDispatchingKernel(op, contiguousKernel); + } + + #endregion + + #region Contiguous Kernel Generation + + /// + /// Delegate for contiguous (SimdFull) operations. + /// Simplified signature - no strides needed since both arrays are contiguous. + /// + public unsafe delegate void ContiguousKernel(T* lhs, T* rhs, T* result, int count) where T : unmanaged; + + /// + /// Try to generate an IL-based contiguous kernel for the given operation and type. + /// + private static ContiguousKernel? TryGenerateContiguousKernel(BinaryOp op) where T : unmanaged + { + // Only support types with Vector256 support + if (!IsSimdSupported()) + return null; + + // Only support basic arithmetic operations + if (op != BinaryOp.Add && op != BinaryOp.Subtract && + op != BinaryOp.Multiply && op != BinaryOp.Divide) + return null; + + try + { + return GenerateContiguousKernelIL(op); + } + catch + { + // IL generation failed - fall back to C# + return null; + } + } + + /// + /// Generate IL for a contiguous SIMD kernel. + /// + private static unsafe ContiguousKernel GenerateContiguousKernelIL(BinaryOp op) where T : unmanaged + { + var dm = new DynamicMethod( + name: $"IL_Contiguous_{op}_{typeof(T).Name}", + returnType: typeof(void), + parameterTypes: new[] { typeof(T*), typeof(T*), typeof(T*), typeof(int) }, + owner: typeof(ILKernelGenerator), + skipVisibility: true + ); + + var il = dm.GetILGenerator(); + + // Declare locals + var locI = il.DeclareLocal(typeof(int)); // loop counter + var locVectorEnd = il.DeclareLocal(typeof(int)); // totalSize - vectorCount + + // Define labels + var lblSimdLoop = il.DefineLabel(); + var lblSimdLoopEnd = il.DefineLabel(); + var lblTailLoop = il.DefineLabel(); + var lblTailLoopEnd = il.DefineLabel(); + + int vectorCount = GetVectorCount(); + int elementSize = Unsafe.SizeOf(); + + // vectorEnd = count - vectorCount + il.Emit(OpCodes.Ldarg_3); // count + il.Emit(OpCodes.Ldc_I4, vectorCount); + il.Emit(OpCodes.Sub); + il.Emit(OpCodes.Stloc, locVectorEnd); + + // i = 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locI); + + // ========== SIMD LOOP ========== + il.MarkLabel(lblSimdLoop); + + // if (i > vectorEnd) goto SimdLoopEnd + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldloc, locVectorEnd); + il.Emit(OpCodes.Bgt, lblSimdLoopEnd); + + // Load lhs vector: Vector256.Load(lhs + i) + il.Emit(OpCodes.Ldarg_0); // lhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, elementSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitVectorLoad(il); + + // Load rhs vector: Vector256.Load(rhs + i) + il.Emit(OpCodes.Ldarg_1); // rhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, elementSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitVectorLoad(il); + + // Perform vector operation + EmitVectorOperation(il, op); + + // Store result: Vector256.Store(result, result + i) + il.Emit(OpCodes.Ldarg_2); // result + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, elementSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitVectorStore(il); + + // i += vectorCount + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4, vectorCount); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblSimdLoop); + il.MarkLabel(lblSimdLoopEnd); + + // ========== TAIL LOOP ========== + il.MarkLabel(lblTailLoop); + + // if (i >= count) goto TailLoopEnd + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldarg_3); // count + il.Emit(OpCodes.Bge, lblTailLoopEnd); + + // result[i] = lhs[i] op rhs[i] + // Address: result + i * elementSize + il.Emit(OpCodes.Ldarg_2); // result + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, elementSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + + // Load lhs[i] + il.Emit(OpCodes.Ldarg_0); // lhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, elementSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il); + + // Load rhs[i] + il.Emit(OpCodes.Ldarg_1); // rhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, elementSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il); + + // Perform scalar operation + EmitScalarOperation(il, op); + + // Store to result[i] + EmitStoreIndirect(il); + + // i++ + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblTailLoop); + il.MarkLabel(lblTailLoopEnd); + + il.Emit(OpCodes.Ret); + + return dm.CreateDelegate>(); + } + + #endregion + + #region Unified Kernel with Dispatch + + /// + /// Create a unified kernel that dispatches to IL-generated code for contiguous arrays. + /// + private static unsafe BinaryKernel CreateDispatchingKernel(BinaryOp op, ContiguousKernel contiguousKernel) + where T : unmanaged + { + // Get the C# fallback kernel method + var csharpKernel = GetCSharpKernel(op); + + return (T* lhs, T* rhs, T* result, int* lhsStrides, int* rhsStrides, int* shape, int ndim, int totalSize) => + { + var path = StrideDetector.Classify(lhsStrides, rhsStrides, shape, ndim); + + if (path == ExecutionPath.SimdFull) + { + // Use IL-generated kernel for contiguous arrays + contiguousKernel(lhs, rhs, result, totalSize); + } + else + { + // Fall back to C# implementation for other paths + csharpKernel(lhs, rhs, result, lhsStrides, rhsStrides, shape, ndim, totalSize); + } + }; + } + + /// + /// Get the C# reference implementation for fallback. + /// + private static unsafe BinaryKernel GetCSharpKernel(BinaryOp op) where T : unmanaged + { + // Return the appropriate C# kernel based on type and operation + if (op == BinaryOp.Add) + { + if (typeof(T) == typeof(int)) + return (BinaryKernel)(Delegate)(BinaryKernel)SimdKernels.Add_Int32; + if (typeof(T) == typeof(long)) + return (BinaryKernel)(Delegate)(BinaryKernel)SimdKernels.Add_Int64; + if (typeof(T) == typeof(float)) + return (BinaryKernel)(Delegate)(BinaryKernel)SimdKernels.Add_Single; + if (typeof(T) == typeof(double)) + return (BinaryKernel)(Delegate)(BinaryKernel)SimdKernels.Add_Double; + } + + throw new NotSupportedException($"C# kernel not available for {op} on {typeof(T).Name}"); + } + + #endregion + + #region IL Emission Helpers (Generic) + + private static bool IsSimdSupported() where T : unmanaged + { + return typeof(T) == typeof(int) || + typeof(T) == typeof(long) || + typeof(T) == typeof(float) || + typeof(T) == typeof(double) || + typeof(T) == typeof(byte) || + typeof(T) == typeof(short) || + typeof(T) == typeof(uint) || + typeof(T) == typeof(ulong) || + typeof(T) == typeof(ushort); + } + + private static int GetVectorCount() where T : unmanaged + { + return VectorBits switch + { + 512 => Vector512.Count, + 256 => Vector256.Count, + 128 => Vector128.Count, + _ => 1 + }; + } + + private static void EmitVectorLoad(ILGenerator il) where T : unmanaged + { + var containerType = GetVectorContainerType(); + + var loadMethod = containerType + .GetMethods(BindingFlags.Public | BindingFlags.Static) + .First(m => m.Name == "Load" && m.IsGenericMethod && + m.GetParameters().Length == 1 && + m.GetParameters()[0].ParameterType.IsPointer) + .MakeGenericMethod(typeof(T)); + + il.EmitCall(OpCodes.Call, loadMethod, null); + } + + private static void EmitVectorStore(ILGenerator il) where T : unmanaged + { + var containerType = GetVectorContainerType(); + var vectorType = GetVectorType(typeof(T)); + + var storeMethod = containerType + .GetMethods(BindingFlags.Public | BindingFlags.Static) + .First(m => m.Name == "Store" && m.IsGenericMethod && + m.GetParameters().Length == 2 && + m.GetParameters()[0].ParameterType.IsGenericType) + .MakeGenericMethod(typeof(T)); + + il.EmitCall(OpCodes.Call, storeMethod, null); + } + + private static void EmitVectorOperation(ILGenerator il, BinaryOp op) where T : unmanaged + { + var vectorType = GetVectorType(typeof(T)); + + string methodName = op switch + { + BinaryOp.Add => "op_Addition", + BinaryOp.Subtract => "op_Subtraction", + BinaryOp.Multiply => "op_Multiply", + BinaryOp.Divide => "op_Division", + _ => throw new NotSupportedException($"Operation {op} not supported for SIMD") + }; + + var opMethod = vectorType.GetMethod(methodName, + BindingFlags.Public | BindingFlags.Static, + null, new[] { vectorType, vectorType }, null); + + if (opMethod == null) + throw new InvalidOperationException($"Could not find {methodName} for {vectorType.Name}"); + + il.EmitCall(OpCodes.Call, opMethod, null); + } + + private static void EmitScalarOperation(ILGenerator il, BinaryOp op) where T : unmanaged + { + // For scalar operations, use IL opcodes + // Stack has two T values + var opcode = op switch + { + BinaryOp.Add => OpCodes.Add, + BinaryOp.Subtract => OpCodes.Sub, + BinaryOp.Multiply => OpCodes.Mul, + BinaryOp.Divide => GetDivOpcode(), + _ => throw new NotSupportedException($"Operation {op} not supported") + }; + + il.Emit(opcode); + } + + private static OpCode GetDivOpcode() where T : unmanaged + { + // Use Div_Un for unsigned types + if (typeof(T) == typeof(byte) || typeof(T) == typeof(ushort) || + typeof(T) == typeof(uint) || typeof(T) == typeof(ulong)) + { + return OpCodes.Div_Un; + } + return OpCodes.Div; + } + + private static void EmitLoadIndirect(ILGenerator il) where T : unmanaged + { + // Emit the appropriate ldind instruction based on type + if (typeof(T) == typeof(byte)) il.Emit(OpCodes.Ldind_U1); + else if (typeof(T) == typeof(sbyte)) il.Emit(OpCodes.Ldind_I1); + else if (typeof(T) == typeof(short)) il.Emit(OpCodes.Ldind_I2); + else if (typeof(T) == typeof(ushort)) il.Emit(OpCodes.Ldind_U2); + else if (typeof(T) == typeof(int)) il.Emit(OpCodes.Ldind_I4); + else if (typeof(T) == typeof(uint)) il.Emit(OpCodes.Ldind_U4); + else if (typeof(T) == typeof(long)) il.Emit(OpCodes.Ldind_I8); + else if (typeof(T) == typeof(ulong)) il.Emit(OpCodes.Ldind_I8); // Same as long + else if (typeof(T) == typeof(float)) il.Emit(OpCodes.Ldind_R4); + else if (typeof(T) == typeof(double)) il.Emit(OpCodes.Ldind_R8); + else throw new NotSupportedException($"Type {typeof(T)} not supported for ldind"); + } + + private static void EmitStoreIndirect(ILGenerator il) where T : unmanaged + { + // Emit the appropriate stind instruction based on type + if (typeof(T) == typeof(byte) || typeof(T) == typeof(sbyte)) il.Emit(OpCodes.Stind_I1); + else if (typeof(T) == typeof(short) || typeof(T) == typeof(ushort)) il.Emit(OpCodes.Stind_I2); + else if (typeof(T) == typeof(int) || typeof(T) == typeof(uint)) il.Emit(OpCodes.Stind_I4); + else if (typeof(T) == typeof(long) || typeof(T) == typeof(ulong)) il.Emit(OpCodes.Stind_I8); + else if (typeof(T) == typeof(float)) il.Emit(OpCodes.Stind_R4); + else if (typeof(T) == typeof(double)) il.Emit(OpCodes.Stind_R8); + else throw new NotSupportedException($"Type {typeof(T)} not supported for stind"); + } + + #endregion + } +} diff --git a/src/NumSharp.Core/Backends/Kernels/ILKernelGenerator.Comparison.cs b/src/NumSharp.Core/Backends/Kernels/ILKernelGenerator.Comparison.cs new file mode 100644 index 00000000..f6ce3dde --- /dev/null +++ b/src/NumSharp.Core/Backends/Kernels/ILKernelGenerator.Comparison.cs @@ -0,0 +1,964 @@ +using System; +using System.Collections.Concurrent; +using System.Linq; +using System.Reflection; +using System.Reflection.Emit; +using System.Runtime.Intrinsics; + +namespace NumSharp.Backends.Kernels +{ + public static partial class ILKernelGenerator + { + #region Comparison Kernel Generation + + /// + /// Cache for comparison kernels. + /// Key: ComparisonKernelKey (LhsType, RhsType, Op, Path) + /// + private static readonly ConcurrentDictionary _comparisonCache = new(); + + /// + /// Number of comparison kernels in cache. + /// + public static int ComparisonCachedCount => _comparisonCache.Count; + + /// + /// Clear the comparison kernel cache. + /// + public static void ClearComparison() => _comparisonCache.Clear(); + + /// + /// Get or generate a comparison kernel for the specified key. + /// + public static ComparisonKernel GetComparisonKernel(ComparisonKernelKey key) + { + if (!Enabled) + throw new InvalidOperationException("IL generation is disabled"); + + return _comparisonCache.GetOrAdd(key, GenerateComparisonKernel); + } + + /// + /// Try to get or generate a comparison kernel. Returns null if generation fails. + /// + public static ComparisonKernel? TryGetComparisonKernel(ComparisonKernelKey key) + { + if (!Enabled) + return null; + + try + { + return _comparisonCache.GetOrAdd(key, GenerateComparisonKernel); + } + catch + { + return null; + } + } + + /// + /// Check if SIMD can be used for this comparison operation. + /// + private static bool CanUseComparisonSimd(ComparisonKernelKey key) + { + if (VectorBits == 0) return false; + if (!CanUseSimd(key.ComparisonType)) return false; + + // Only for contiguous (SimdFull) path initially + return key.Path == ExecutionPath.SimdFull; + } + + /// + /// Generate a comparison kernel for the specified key. + /// + private static ComparisonKernel GenerateComparisonKernel(ComparisonKernelKey key) + { + return key.Path switch + { + ExecutionPath.SimdFull => GenerateComparisonSimdFullKernel(key), + ExecutionPath.SimdScalarRight => GenerateComparisonScalarRightKernel(key), + ExecutionPath.SimdScalarLeft => GenerateComparisonScalarLeftKernel(key), + ExecutionPath.SimdChunk => GenerateComparisonGeneralKernel(key), // Fall through to general + ExecutionPath.General => GenerateComparisonGeneralKernel(key), + _ => throw new NotSupportedException($"Path {key.Path} not supported") + }; + } + + /// + /// Generate a comparison kernel for contiguous arrays. + /// + private static ComparisonKernel GenerateComparisonSimdFullKernel(ComparisonKernelKey key) + { + // ComparisonKernel signature: + // void(void* lhs, void* rhs, bool* result, int* lhsStrides, int* rhsStrides, int* shape, int ndim, int totalSize) + var dm = new DynamicMethod( + name: $"Comparison_SimdFull_{key}", + returnType: typeof(void), + parameterTypes: new[] + { + typeof(void*), typeof(void*), typeof(bool*), + typeof(int*), typeof(int*), typeof(int*), + typeof(int), typeof(int) + }, + owner: typeof(ILKernelGenerator), + skipVisibility: true + ); + + var il = dm.GetILGenerator(); + + int lhsSize = GetTypeSize(key.LhsType); + int rhsSize = GetTypeSize(key.RhsType); + var comparisonType = key.ComparisonType; + + if (CanUseComparisonSimd(key)) + { + EmitComparisonSimdLoop(il, key, lhsSize, rhsSize, comparisonType); + } + else + { + EmitComparisonScalarLoop(il, key, lhsSize, rhsSize, comparisonType); + } + + il.Emit(OpCodes.Ret); + return dm.CreateDelegate(); + } + + /// + /// Generate a comparison kernel for scalar right operand. + /// + private static ComparisonKernel GenerateComparisonScalarRightKernel(ComparisonKernelKey key) + { + var dm = new DynamicMethod( + name: $"Comparison_ScalarRight_{key}", + returnType: typeof(void), + parameterTypes: new[] + { + typeof(void*), typeof(void*), typeof(bool*), + typeof(int*), typeof(int*), typeof(int*), + typeof(int), typeof(int) + }, + owner: typeof(ILKernelGenerator), + skipVisibility: true + ); + + var il = dm.GetILGenerator(); + + int lhsSize = GetTypeSize(key.LhsType); + int rhsSize = GetTypeSize(key.RhsType); + var comparisonType = key.ComparisonType; + + EmitComparisonScalarRightLoop(il, key, lhsSize, rhsSize, comparisonType); + + il.Emit(OpCodes.Ret); + return dm.CreateDelegate(); + } + + /// + /// Generate a comparison kernel for scalar left operand. + /// + private static ComparisonKernel GenerateComparisonScalarLeftKernel(ComparisonKernelKey key) + { + var dm = new DynamicMethod( + name: $"Comparison_ScalarLeft_{key}", + returnType: typeof(void), + parameterTypes: new[] + { + typeof(void*), typeof(void*), typeof(bool*), + typeof(int*), typeof(int*), typeof(int*), + typeof(int), typeof(int) + }, + owner: typeof(ILKernelGenerator), + skipVisibility: true + ); + + var il = dm.GetILGenerator(); + + int lhsSize = GetTypeSize(key.LhsType); + int rhsSize = GetTypeSize(key.RhsType); + var comparisonType = key.ComparisonType; + + EmitComparisonScalarLeftLoop(il, key, lhsSize, rhsSize, comparisonType); + + il.Emit(OpCodes.Ret); + return dm.CreateDelegate(); + } + + /// + /// Generate a general comparison kernel for arbitrary strides. + /// + private static ComparisonKernel GenerateComparisonGeneralKernel(ComparisonKernelKey key) + { + var dm = new DynamicMethod( + name: $"Comparison_General_{key}", + returnType: typeof(void), + parameterTypes: new[] + { + typeof(void*), typeof(void*), typeof(bool*), + typeof(int*), typeof(int*), typeof(int*), + typeof(int), typeof(int) + }, + owner: typeof(ILKernelGenerator), + skipVisibility: true + ); + + var il = dm.GetILGenerator(); + + int lhsSize = GetTypeSize(key.LhsType); + int rhsSize = GetTypeSize(key.RhsType); + var comparisonType = key.ComparisonType; + + EmitComparisonGeneralLoop(il, key, lhsSize, rhsSize, comparisonType); + + il.Emit(OpCodes.Ret); + return dm.CreateDelegate(); + } + + #region Comparison Loop Emission + + /// + /// Emit a SIMD loop for contiguous comparison (adapts to V128/V256/V512). + /// + private static void EmitComparisonSimdLoop(ILGenerator il, ComparisonKernelKey key, + int lhsSize, int rhsSize, NPTypeCode comparisonType) + { + int vectorCount = GetVectorCount(comparisonType); + var clrType = GetClrType(comparisonType); + var vectorType = GetVectorType(clrType); + + // Args: void* lhs (0), void* rhs (1), bool* result (2), + // int* lhsStrides (3), int* rhsStrides (4), int* shape (5), + // int ndim (6), int totalSize (7) + + var locI = il.DeclareLocal(typeof(int)); + var locVectorEnd = il.DeclareLocal(typeof(int)); + var locMask = il.DeclareLocal(vectorType); + + // vectorEnd = totalSize - vectorCount + 1 (last valid SIMD start position) + il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize + il.Emit(OpCodes.Ldc_I4, vectorCount - 1); + il.Emit(OpCodes.Sub); + il.Emit(OpCodes.Stloc, locVectorEnd); + + // i = 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locI); + + var lblSimdLoop = il.DefineLabel(); + var lblSimdEnd = il.DefineLabel(); + var lblTailLoop = il.DefineLabel(); + var lblTailEnd = il.DefineLabel(); + + // === SIMD Loop === + il.MarkLabel(lblSimdLoop); + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldloc, locVectorEnd); + il.Emit(OpCodes.Bgt, lblSimdEnd); + + // Load lhs vector: lhs + i * elemSize + il.Emit(OpCodes.Ldarg_0); // lhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, lhsSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitVectorLoad(il, comparisonType); + + // Load rhs vector: rhs + i * elemSize + il.Emit(OpCodes.Ldarg_1); // rhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, rhsSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitVectorLoad(il, comparisonType); + + // Compare: produces mask vector + EmitVectorComparison(il, key.Op, comparisonType); + il.Emit(OpCodes.Stloc, locMask); + + // Extract mask to booleans + EmitMaskToBoolExtraction(il, comparisonType, vectorCount, locI, locMask); + + // i += vectorCount + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4, vectorCount); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + il.Emit(OpCodes.Br, lblSimdLoop); + + // === Tail Loop (scalar) === + il.MarkLabel(lblSimdEnd); + il.MarkLabel(lblTailLoop); + + // if (i >= totalSize) goto end + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize + il.Emit(OpCodes.Bge, lblTailEnd); + + // result[i] = (lhs[i] op rhs[i]) + il.Emit(OpCodes.Ldarg_2); // result (bool*) + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Add); + + // Load lhs[i] + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, lhsSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.LhsType); + if (key.LhsType != comparisonType) + EmitConvertTo(il, key.LhsType, comparisonType); + + // Load rhs[i] + il.Emit(OpCodes.Ldarg_1); + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, rhsSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.RhsType); + if (key.RhsType != comparisonType) + EmitConvertTo(il, key.RhsType, comparisonType); + + // Compare + EmitComparisonOperation(il, key.Op, comparisonType); + + // Store result + il.Emit(OpCodes.Stind_I1); + + // i++ + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + il.Emit(OpCodes.Br, lblTailLoop); + + il.MarkLabel(lblTailEnd); + } + + /// + /// Emit a SIMD comparison operation (adapts to V128/V256/V512). + /// Stack has [lhs_vector, rhs_vector], result is comparison mask vector. + /// + private static void EmitVectorComparison(ILGenerator il, ComparisonOp op, NPTypeCode type) + { + var containerType = GetVectorContainerType(); + var clrType = GetClrType(type); + var vectorType = GetVectorType(clrType); + + string methodName = op switch + { + ComparisonOp.Equal => "Equals", + ComparisonOp.NotEqual => "Equals", // Invert later + ComparisonOp.Less => "LessThan", + ComparisonOp.LessEqual => "LessThanOrEqual", + ComparisonOp.Greater => "GreaterThan", + ComparisonOp.GreaterEqual => "GreaterThanOrEqual", + _ => throw new NotSupportedException($"Comparison op {op} not supported for SIMD") + }; + + var cmpMethod = containerType.GetMethods(BindingFlags.Public | BindingFlags.Static) + .Where(m => m.Name == methodName && m.IsGenericMethod && m.GetParameters().Length == 2) + .Select(m => m.MakeGenericMethod(clrType)) + .First(m => m.GetParameters()[0].ParameterType == vectorType); + + il.EmitCall(OpCodes.Call, cmpMethod, null); + + // For NotEqual, invert the result using OnesComplement + if (op == ComparisonOp.NotEqual) + { + var onesCompMethod = containerType.GetMethods(BindingFlags.Public | BindingFlags.Static) + .Where(m => m.Name == "OnesComplement" && m.IsGenericMethod && m.GetParameters().Length == 1) + .Select(m => m.MakeGenericMethod(clrType)) + .First(m => m.GetParameters()[0].ParameterType == vectorType); + + il.EmitCall(OpCodes.Call, onesCompMethod, null); + } + } + + /// + /// Emit extraction of comparison mask vector to individual booleans. + /// Uses ExtractMostSignificantBits for O(1) extraction instead of O(N) GetElement calls. + /// + private static void EmitMaskToBoolExtraction(ILGenerator il, NPTypeCode type, + int vectorCount, LocalBuilder locI, LocalBuilder locMask) + { + var containerType = GetVectorContainerType(); + var clrType = GetClrType(type); + var vectorType = GetVectorType(clrType); + + // ExtractMostSignificantBits gives us a uint where each bit is the MSB of each lane + // For comparison masks (all 1s = true, all 0s = false), MSB=1 means true + var extractMethod = containerType.GetMethods(BindingFlags.Public | BindingFlags.Static) + .Where(m => m.Name == "ExtractMostSignificantBits" && m.IsGenericMethod) + .Select(m => m.MakeGenericMethod(clrType)) + .First(); + + // bits = ExtractMostSignificantBits(mask) + il.Emit(OpCodes.Ldloc, locMask); + il.EmitCall(OpCodes.Call, extractMethod, null); + var locBits = il.DeclareLocal(typeof(uint)); + il.Emit(OpCodes.Stloc, locBits); + + // For each lane j, store (bits >> j) & 1 as bool + for (int j = 0; j < vectorCount; j++) + { + // result + i + j + il.Emit(OpCodes.Ldarg_2); // result (bool*) + il.Emit(OpCodes.Ldloc, locI); + if (j > 0) + { + il.Emit(OpCodes.Ldc_I4, j); + il.Emit(OpCodes.Add); + } + il.Emit(OpCodes.Add); + + // (bits >> j) & 1 + il.Emit(OpCodes.Ldloc, locBits); + if (j > 0) + { + il.Emit(OpCodes.Ldc_I4, j); + il.Emit(OpCodes.Shr_Un); + } + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.And); + + // Store as bool (1 byte) + il.Emit(OpCodes.Stind_I1); + } + } + + /// + /// Emit a scalar loop for contiguous comparison. + /// + private static void EmitComparisonScalarLoop(ILGenerator il, ComparisonKernelKey key, + int lhsSize, int rhsSize, NPTypeCode comparisonType) + { + // Args: void* lhs (0), void* rhs (1), bool* result (2), + // int* lhsStrides (3), int* rhsStrides (4), int* shape (5), + // int ndim (6), int totalSize (7) + + var locI = il.DeclareLocal(typeof(int)); // loop counter + + var lblLoop = il.DefineLabel(); + var lblLoopEnd = il.DefineLabel(); + + // i = 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locI); + + il.MarkLabel(lblLoop); + + // if (i >= totalSize) goto end + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize + il.Emit(OpCodes.Bge, lblLoopEnd); + + // result[i] = (lhs[i] op rhs[i]) + // Load result address + il.Emit(OpCodes.Ldarg_2); // result (bool*) + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Add); // bool is 1 byte, so just add i + + // Load lhs[i] and convert to comparison type + il.Emit(OpCodes.Ldarg_0); // lhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, lhsSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.LhsType); + EmitConvertTo(il, key.LhsType, comparisonType); + + // Load rhs[i] and convert to comparison type + il.Emit(OpCodes.Ldarg_1); // rhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, rhsSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.RhsType); + EmitConvertTo(il, key.RhsType, comparisonType); + + // Perform comparison + EmitComparisonOperation(il, key.Op, comparisonType); + + // Store bool result + il.Emit(OpCodes.Stind_I1); + + // i++ + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblLoop); + il.MarkLabel(lblLoopEnd); + } + + /// + /// Emit loop for scalar right operand comparison. + /// + private static void EmitComparisonScalarRightLoop(ILGenerator il, ComparisonKernelKey key, + int lhsSize, int rhsSize, NPTypeCode comparisonType) + { + var locI = il.DeclareLocal(typeof(int)); // loop counter + var locRhsVal = il.DeclareLocal(GetClrType(comparisonType)); // scalar value + + var lblLoop = il.DefineLabel(); + var lblLoopEnd = il.DefineLabel(); + + // Load rhs[0] and convert to comparison type, store in local + il.Emit(OpCodes.Ldarg_1); // rhs + EmitLoadIndirect(il, key.RhsType); + EmitConvertTo(il, key.RhsType, comparisonType); + il.Emit(OpCodes.Stloc, locRhsVal); + + // i = 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locI); + + il.MarkLabel(lblLoop); + + // if (i >= totalSize) goto end + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize + il.Emit(OpCodes.Bge, lblLoopEnd); + + // result[i] = (lhs[i] op rhsVal) + il.Emit(OpCodes.Ldarg_2); // result + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Add); + + // Load lhs[i] and convert + il.Emit(OpCodes.Ldarg_0); // lhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, lhsSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.LhsType); + EmitConvertTo(il, key.LhsType, comparisonType); + + // Load cached rhs scalar + il.Emit(OpCodes.Ldloc, locRhsVal); + + EmitComparisonOperation(il, key.Op, comparisonType); + il.Emit(OpCodes.Stind_I1); + + // i++ + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblLoop); + il.MarkLabel(lblLoopEnd); + } + + /// + /// Emit loop for scalar left operand comparison. + /// + private static void EmitComparisonScalarLeftLoop(ILGenerator il, ComparisonKernelKey key, + int lhsSize, int rhsSize, NPTypeCode comparisonType) + { + var locI = il.DeclareLocal(typeof(int)); // loop counter + var locLhsVal = il.DeclareLocal(GetClrType(comparisonType)); // scalar value + + var lblLoop = il.DefineLabel(); + var lblLoopEnd = il.DefineLabel(); + + // Load lhs[0] and convert to comparison type, store in local + il.Emit(OpCodes.Ldarg_0); // lhs + EmitLoadIndirect(il, key.LhsType); + EmitConvertTo(il, key.LhsType, comparisonType); + il.Emit(OpCodes.Stloc, locLhsVal); + + // i = 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locI); + + il.MarkLabel(lblLoop); + + // if (i >= totalSize) goto end + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize + il.Emit(OpCodes.Bge, lblLoopEnd); + + // result[i] = (lhsVal op rhs[i]) + il.Emit(OpCodes.Ldarg_2); // result + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Add); + + // Load cached lhs scalar + il.Emit(OpCodes.Ldloc, locLhsVal); + + // Load rhs[i] and convert + il.Emit(OpCodes.Ldarg_1); // rhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, rhsSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.RhsType); + EmitConvertTo(il, key.RhsType, comparisonType); + + EmitComparisonOperation(il, key.Op, comparisonType); + il.Emit(OpCodes.Stind_I1); + + // i++ + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblLoop); + il.MarkLabel(lblLoopEnd); + } + + /// + /// Emit general coordinate-based iteration loop for comparison. + /// + private static void EmitComparisonGeneralLoop(ILGenerator il, ComparisonKernelKey key, + int lhsSize, int rhsSize, NPTypeCode comparisonType) + { + // Args: void* lhs (0), void* rhs (1), bool* result (2), + // int* lhsStrides (3), int* rhsStrides (4), int* shape (5), + // int ndim (6), int totalSize (7) + + var locI = il.DeclareLocal(typeof(int)); // linear index + var locD = il.DeclareLocal(typeof(int)); // dimension counter + var locLhsOffset = il.DeclareLocal(typeof(int)); // lhs offset + var locRhsOffset = il.DeclareLocal(typeof(int)); // rhs offset + var locCoord = il.DeclareLocal(typeof(int)); // current coordinate + var locIdx = il.DeclareLocal(typeof(int)); // temp for coordinate calculation + + var lblLoop = il.DefineLabel(); + var lblLoopEnd = il.DefineLabel(); + var lblDimLoop = il.DefineLabel(); + var lblDimLoopEnd = il.DefineLabel(); + + // i = 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locI); + + // Main loop + il.MarkLabel(lblLoop); + + // if (i >= totalSize) goto end + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize + il.Emit(OpCodes.Bge, lblLoopEnd); + + // Calculate lhsOffset and rhsOffset from linear index + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locLhsOffset); + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locRhsOffset); + + // idx = i (for coordinate calculation) + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Stloc, locIdx); + + // d = ndim - 1 + il.Emit(OpCodes.Ldarg_S, (byte)6); // ndim + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Sub); + il.Emit(OpCodes.Stloc, locD); + + il.MarkLabel(lblDimLoop); + + // if (d < 0) goto DimLoopEnd + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Blt, lblDimLoopEnd); + + // coord = idx % shape[d] + il.Emit(OpCodes.Ldloc, locIdx); + il.Emit(OpCodes.Ldarg_S, (byte)5); // shape + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4_4); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Ldind_I4); + il.Emit(OpCodes.Rem); + il.Emit(OpCodes.Stloc, locCoord); + + // idx /= shape[d] + il.Emit(OpCodes.Ldloc, locIdx); + il.Emit(OpCodes.Ldarg_S, (byte)5); // shape + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4_4); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Ldind_I4); + il.Emit(OpCodes.Div); + il.Emit(OpCodes.Stloc, locIdx); + + // lhsOffset += coord * lhsStrides[d] + il.Emit(OpCodes.Ldloc, locLhsOffset); + il.Emit(OpCodes.Ldloc, locCoord); + il.Emit(OpCodes.Ldarg_3); // lhsStrides + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4_4); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Ldind_I4); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locLhsOffset); + + // rhsOffset += coord * rhsStrides[d] + il.Emit(OpCodes.Ldloc, locRhsOffset); + il.Emit(OpCodes.Ldloc, locCoord); + il.Emit(OpCodes.Ldarg_S, (byte)4); // rhsStrides + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4_4); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Ldind_I4); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locRhsOffset); + + // d-- + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Sub); + il.Emit(OpCodes.Stloc, locD); + + il.Emit(OpCodes.Br, lblDimLoop); + il.MarkLabel(lblDimLoopEnd); + + // result[i] = (lhs[lhsOffset] op rhs[rhsOffset]) + // Load result address (contiguous output) + il.Emit(OpCodes.Ldarg_2); // result + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Add); + + // Load lhs[lhsOffset] + il.Emit(OpCodes.Ldarg_0); // lhs + il.Emit(OpCodes.Ldloc, locLhsOffset); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, lhsSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.LhsType); + EmitConvertTo(il, key.LhsType, comparisonType); + + // Load rhs[rhsOffset] + il.Emit(OpCodes.Ldarg_1); // rhs + il.Emit(OpCodes.Ldloc, locRhsOffset); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, rhsSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.RhsType); + EmitConvertTo(il, key.RhsType, comparisonType); + + // Comparison + EmitComparisonOperation(il, key.Op, comparisonType); + + // Store bool + il.Emit(OpCodes.Stind_I1); + + // i++ + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblLoop); + il.MarkLabel(lblLoopEnd); + } + + #endregion + + #region Comparison Operation Emission + + /// + /// Emit comparison operation. Stack has two values of comparisonType, result is bool (0 or 1). + /// + internal static void EmitComparisonOperation(ILGenerator il, ComparisonOp op, NPTypeCode comparisonType) + { + // Special handling for decimal comparisons + if (comparisonType == NPTypeCode.Decimal) + { + EmitDecimalComparison(il, op); + return; + } + + bool isUnsigned = IsUnsigned(comparisonType); + bool isFloat = comparisonType == NPTypeCode.Single || comparisonType == NPTypeCode.Double; + + switch (op) + { + case ComparisonOp.Equal: + il.Emit(OpCodes.Ceq); + break; + + case ComparisonOp.NotEqual: + il.Emit(OpCodes.Ceq); + // Negate: result = !result (xor with 1) + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Ceq); + break; + + case ComparisonOp.Less: + if (isUnsigned) + il.Emit(OpCodes.Clt_Un); + else + il.Emit(OpCodes.Clt); + break; + + case ComparisonOp.LessEqual: + // a <= b is !(a > b) + if (isUnsigned) + il.Emit(OpCodes.Cgt_Un); + else + il.Emit(OpCodes.Cgt); + // Negate + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Ceq); + break; + + case ComparisonOp.Greater: + if (isUnsigned) + il.Emit(OpCodes.Cgt_Un); + else + il.Emit(OpCodes.Cgt); + break; + + case ComparisonOp.GreaterEqual: + // a >= b is !(a < b) + if (isUnsigned) + il.Emit(OpCodes.Clt_Un); + else + il.Emit(OpCodes.Clt); + // Negate + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Ceq); + break; + + default: + throw new NotSupportedException($"Comparison operation {op} not supported"); + } + } + + /// + /// Emit decimal comparison using operator methods. + /// + private static void EmitDecimalComparison(ILGenerator il, ComparisonOp op) + { + // decimal has comparison operators that return bool + string methodName = op switch + { + ComparisonOp.Equal => "op_Equality", + ComparisonOp.NotEqual => "op_Inequality", + ComparisonOp.Less => "op_LessThan", + ComparisonOp.LessEqual => "op_LessThanOrEqual", + ComparisonOp.Greater => "op_GreaterThan", + ComparisonOp.GreaterEqual => "op_GreaterThanOrEqual", + _ => throw new NotSupportedException($"Comparison {op} not supported for decimal") + }; + + var method = typeof(decimal).GetMethod( + methodName, + BindingFlags.Public | BindingFlags.Static, + null, + new[] { typeof(decimal), typeof(decimal) }, + null + ); + + il.EmitCall(OpCodes.Call, method!, null); + } + + #endregion + + #region Comparison Scalar Kernel Generation + + /// + /// Cache key for comparison scalar operation kernels. + /// + public readonly record struct ComparisonScalarKernelKey( + NPTypeCode LhsType, + NPTypeCode RhsType, + ComparisonOp Op + ) + { + public NPTypeCode ComparisonType => np._FindCommonScalarType(LhsType, RhsType); + public override string ToString() => $"ScalarCmp_{Op}_{LhsType}_{RhsType}"; + } + + /// + /// Cache for comparison scalar kernels. + /// + private static readonly ConcurrentDictionary _comparisonScalarCache = new(); + + /// + /// Number of comparison scalar kernels in cache. + /// + public static int ComparisonScalarCachedCount => _comparisonScalarCache.Count; + + /// + /// Get or generate a comparison scalar delegate. + /// Returns a Func<TLhs, TRhs, bool> delegate. + /// + public static Delegate GetComparisonScalarDelegate(ComparisonScalarKernelKey key) + { + if (!Enabled) + throw new InvalidOperationException("IL generation is disabled"); + + return _comparisonScalarCache.GetOrAdd(key, GenerateComparisonScalarDelegate); + } + + /// + /// Generate an IL-based comparison scalar delegate. + /// + private static Delegate GenerateComparisonScalarDelegate(ComparisonScalarKernelKey key) + { + var lhsClr = GetClrType(key.LhsType); + var rhsClr = GetClrType(key.RhsType); + var comparisonType = key.ComparisonType; + + // Create DynamicMethod: bool Method(TLhs lhs, TRhs rhs) + var dm = new DynamicMethod( + name: $"ScalarComparison_{key}", + returnType: typeof(bool), + parameterTypes: new[] { lhsClr, rhsClr }, + owner: typeof(ILKernelGenerator), + skipVisibility: true + ); + + var il = dm.GetILGenerator(); + + // Load lhs, convert to comparison type + il.Emit(OpCodes.Ldarg_0); + EmitConvertTo(il, key.LhsType, comparisonType); + + // Load rhs, convert to comparison type + il.Emit(OpCodes.Ldarg_1); + EmitConvertTo(il, key.RhsType, comparisonType); + + // Perform comparison + EmitComparisonOperation(il, key.Op, comparisonType); + + // Return + il.Emit(OpCodes.Ret); + + // Create typed Func + var funcType = typeof(Func<,,>).MakeGenericType(lhsClr, rhsClr, typeof(bool)); + return dm.CreateDelegate(funcType); + } + + #endregion + + #endregion + } +} diff --git a/src/NumSharp.Core/Backends/Kernels/ILKernelGenerator.MixedType.cs b/src/NumSharp.Core/Backends/Kernels/ILKernelGenerator.MixedType.cs new file mode 100644 index 00000000..1e37048b --- /dev/null +++ b/src/NumSharp.Core/Backends/Kernels/ILKernelGenerator.MixedType.cs @@ -0,0 +1,1064 @@ +using System; +using System.Collections.Concurrent; +using System.Reflection.Emit; + +namespace NumSharp.Backends.Kernels +{ + /// + /// Mixed-type binary operations and IL loop emission. + /// + public static partial class ILKernelGenerator + { + #region Mixed-Type Kernel Generation + + /// + /// Cache for mixed-type kernels. + /// Key: MixedTypeKernelKey (LhsType, RhsType, ResultType, Op, Path) + /// + private static readonly ConcurrentDictionary _mixedTypeCache = new(); + + /// + /// Number of mixed-type kernels in cache. + /// + public static int MixedTypeCachedCount => _mixedTypeCache.Count; + + /// + /// Clear all kernel caches. + /// + public static void ClearAll() + { + _contiguousKernelCache.Clear(); + _mixedTypeCache.Clear(); + _unaryCache.Clear(); + _unaryScalarCache.Clear(); + _binaryScalarCache.Clear(); + _comparisonCache.Clear(); + _comparisonScalarCache.Clear(); + _elementReductionCache.Clear(); + } + + /// + /// Get or generate a mixed-type kernel for the specified key. + /// + public static MixedTypeKernel GetMixedTypeKernel(MixedTypeKernelKey key) + { + if (!Enabled) + throw new InvalidOperationException("IL generation is disabled"); + + return _mixedTypeCache.GetOrAdd(key, GenerateMixedTypeKernel); + } + + /// + /// Try to get or generate a mixed-type kernel. Returns null if generation fails. + /// + public static MixedTypeKernel? TryGetMixedTypeKernel(MixedTypeKernelKey key) + { + if (!Enabled) + return null; + + try + { + return _mixedTypeCache.GetOrAdd(key, GenerateMixedTypeKernel); + } + catch + { + return null; + } + } + + /// + /// Generate a mixed-type kernel for the specified key. + /// + private static MixedTypeKernel GenerateMixedTypeKernel(MixedTypeKernelKey key) + { + return key.Path switch + { + ExecutionPath.SimdFull => GenerateSimdFullKernel(key), + ExecutionPath.SimdScalarRight => GenerateSimdScalarRightKernel(key), + ExecutionPath.SimdScalarLeft => GenerateSimdScalarLeftKernel(key), + ExecutionPath.SimdChunk => GenerateSimdChunkKernel(key), + ExecutionPath.General => GenerateGeneralKernel(key), + _ => throw new NotSupportedException($"Path {key.Path} not supported") + }; + } + + #endregion + + #region Path-Specific Kernel Generation + + /// + /// Generate a SimdFull kernel for contiguous arrays (both operands contiguous). + /// Uses Vector256 SIMD for supported types and operations, scalar loop otherwise. + /// + private static MixedTypeKernel GenerateSimdFullKernel(MixedTypeKernelKey key) + { + // MixedTypeKernel signature: + // void(void* lhs, void* rhs, void* result, int* lhsStrides, int* rhsStrides, int* shape, int ndim, int totalSize) + var dm = new DynamicMethod( + name: $"MixedType_SimdFull_{key}", + returnType: typeof(void), + parameterTypes: new[] + { + typeof(void*), typeof(void*), typeof(void*), + typeof(int*), typeof(int*), typeof(int*), + typeof(int), typeof(int) + }, + owner: typeof(ILKernelGenerator), + skipVisibility: true + ); + + var il = dm.GetILGenerator(); + + int lhsSize = GetTypeSize(key.LhsType); + int rhsSize = GetTypeSize(key.RhsType); + int resultSize = GetTypeSize(key.ResultType); + + // Can only use SIMD for same-type, supported types, and supported operations + // Mod doesn't have SIMD support (no Vector256 modulo operator) + bool canSimd = CanUseSimd(key.ResultType) && key.IsSameType && CanUseSimdForOp(key.Op); + + if (canSimd) + { + EmitSimdFullLoop(il, key, lhsSize, rhsSize, resultSize); + } + else + { + EmitScalarFullLoop(il, key, lhsSize, rhsSize, resultSize); + } + + il.Emit(OpCodes.Ret); + return dm.CreateDelegate(); + } + + /// + /// Check if operation has SIMD support via Vector256. + /// + private static bool CanUseSimdForOp(BinaryOp op) + { + // Only Add, Subtract, Multiply, Divide have Vector256 operators + // Mod requires scalar implementation + return op == BinaryOp.Add || op == BinaryOp.Subtract || + op == BinaryOp.Multiply || op == BinaryOp.Divide; + } + + /// + /// Generate a SimdScalarRight kernel (right operand is scalar). + /// Uses SIMD when LHS type equals result type (no per-element conversion needed). + /// + private static MixedTypeKernel GenerateSimdScalarRightKernel(MixedTypeKernelKey key) + { + var dm = new DynamicMethod( + name: $"MixedType_SimdScalarRight_{key}", + returnType: typeof(void), + parameterTypes: new[] + { + typeof(void*), typeof(void*), typeof(void*), + typeof(int*), typeof(int*), typeof(int*), + typeof(int), typeof(int) + }, + owner: typeof(ILKernelGenerator), + skipVisibility: true + ); + + var il = dm.GetILGenerator(); + + int lhsSize = GetTypeSize(key.LhsType); + int rhsSize = GetTypeSize(key.RhsType); + int resultSize = GetTypeSize(key.ResultType); + + // Use SIMD when: LHS type == Result type (no per-element conversion needed), + // result type supports SIMD, and operation has SIMD support + bool canUseSimd = key.LhsType == key.ResultType && + CanUseSimd(key.ResultType) && + CanUseSimdForOp(key.Op); + + if (canUseSimd) + { + EmitSimdScalarRightLoop(il, key, resultSize); + } + else + { + EmitScalarRightLoop(il, key, lhsSize, rhsSize, resultSize); + } + + il.Emit(OpCodes.Ret); + return dm.CreateDelegate(); + } + + /// + /// Generate a SimdScalarLeft kernel (left operand is scalar). + /// Uses SIMD when RHS type equals result type (no per-element conversion needed). + /// + private static MixedTypeKernel GenerateSimdScalarLeftKernel(MixedTypeKernelKey key) + { + var dm = new DynamicMethod( + name: $"MixedType_SimdScalarLeft_{key}", + returnType: typeof(void), + parameterTypes: new[] + { + typeof(void*), typeof(void*), typeof(void*), + typeof(int*), typeof(int*), typeof(int*), + typeof(int), typeof(int) + }, + owner: typeof(ILKernelGenerator), + skipVisibility: true + ); + + var il = dm.GetILGenerator(); + + int lhsSize = GetTypeSize(key.LhsType); + int rhsSize = GetTypeSize(key.RhsType); + int resultSize = GetTypeSize(key.ResultType); + + // Use SIMD when: RHS type == Result type (no per-element conversion needed), + // result type supports SIMD, and operation has SIMD support + bool canUseSimd = key.RhsType == key.ResultType && + CanUseSimd(key.ResultType) && + CanUseSimdForOp(key.Op); + + if (canUseSimd) + { + EmitSimdScalarLeftLoop(il, key, resultSize); + } + else + { + EmitScalarLeftLoop(il, key, lhsSize, rhsSize, resultSize); + } + + il.Emit(OpCodes.Ret); + return dm.CreateDelegate(); + } + + /// + /// Generate a SimdChunk kernel (inner dimension contiguous/broadcast). + /// + private static MixedTypeKernel GenerateSimdChunkKernel(MixedTypeKernelKey key) + { + var dm = new DynamicMethod( + name: $"MixedType_SimdChunk_{key}", + returnType: typeof(void), + parameterTypes: new[] + { + typeof(void*), typeof(void*), typeof(void*), + typeof(int*), typeof(int*), typeof(int*), + typeof(int), typeof(int) + }, + owner: typeof(ILKernelGenerator), + skipVisibility: true + ); + + var il = dm.GetILGenerator(); + + int lhsSize = GetTypeSize(key.LhsType); + int rhsSize = GetTypeSize(key.RhsType); + int resultSize = GetTypeSize(key.ResultType); + + EmitChunkLoop(il, key, lhsSize, rhsSize, resultSize); + + il.Emit(OpCodes.Ret); + return dm.CreateDelegate(); + } + + /// + /// Generate a General kernel (arbitrary strides, coordinate-based iteration). + /// + private static MixedTypeKernel GenerateGeneralKernel(MixedTypeKernelKey key) + { + var dm = new DynamicMethod( + name: $"MixedType_General_{key}", + returnType: typeof(void), + parameterTypes: new[] + { + typeof(void*), typeof(void*), typeof(void*), + typeof(int*), typeof(int*), typeof(int*), + typeof(int), typeof(int) + }, + owner: typeof(ILKernelGenerator), + skipVisibility: true + ); + + var il = dm.GetILGenerator(); + + int lhsSize = GetTypeSize(key.LhsType); + int rhsSize = GetTypeSize(key.RhsType); + int resultSize = GetTypeSize(key.ResultType); + + EmitGeneralLoop(il, key, lhsSize, rhsSize, resultSize); + + il.Emit(OpCodes.Ret); + return dm.CreateDelegate(); + } + + #endregion + + #region IL Loop Emission + + /// + /// Emit a scalar loop for contiguous arrays (no SIMD). + /// + private static void EmitScalarFullLoop(ILGenerator il, MixedTypeKernelKey key, + int lhsSize, int rhsSize, int resultSize) + { + // Args: void* lhs (0), void* rhs (1), void* result (2), + // int* lhsStrides (3), int* rhsStrides (4), int* shape (5), + // int ndim (6), int totalSize (7) + + var locI = il.DeclareLocal(typeof(int)); // loop counter + + var lblLoop = il.DefineLabel(); + var lblLoopEnd = il.DefineLabel(); + + // i = 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locI); + + il.MarkLabel(lblLoop); + + // if (i >= totalSize) goto end + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize + il.Emit(OpCodes.Bge, lblLoopEnd); + + // result[i] = op(lhs[i], rhs[i]) + // Load result address + il.Emit(OpCodes.Ldarg_2); // result + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, resultSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + + // Load lhs[i] and convert to result type + il.Emit(OpCodes.Ldarg_0); // lhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, lhsSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.LhsType); + EmitConvertTo(il, key.LhsType, key.ResultType); + + // Load rhs[i] and convert to result type + il.Emit(OpCodes.Ldarg_1); // rhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, rhsSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.RhsType); + EmitConvertTo(il, key.RhsType, key.ResultType); + + // Perform operation + EmitScalarOperation(il, key.Op, key.ResultType); + + // Store result + EmitStoreIndirect(il, key.ResultType); + + // i++ + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblLoop); + il.MarkLabel(lblLoopEnd); + } + + /// + /// Emit a SIMD loop for contiguous same-type arrays. + /// + private static void EmitSimdFullLoop(ILGenerator il, MixedTypeKernelKey key, + int lhsSize, int rhsSize, int resultSize) + { + // For same-type operations, use Vector256 + int vectorCount = GetVectorCount(key.ResultType); + + var locI = il.DeclareLocal(typeof(int)); // loop counter + var locVectorEnd = il.DeclareLocal(typeof(int)); // totalSize - vectorCount + + var lblSimdLoop = il.DefineLabel(); + var lblSimdLoopEnd = il.DefineLabel(); + var lblTailLoop = il.DefineLabel(); + var lblTailLoopEnd = il.DefineLabel(); + + // vectorEnd = totalSize - vectorCount + il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize + il.Emit(OpCodes.Ldc_I4, vectorCount); + il.Emit(OpCodes.Sub); + il.Emit(OpCodes.Stloc, locVectorEnd); + + // i = 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locI); + + // === SIMD LOOP === + il.MarkLabel(lblSimdLoop); + + // if (i > vectorEnd) goto SimdLoopEnd + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldloc, locVectorEnd); + il.Emit(OpCodes.Bgt, lblSimdLoopEnd); + + // Load lhs vector + il.Emit(OpCodes.Ldarg_0); // lhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, lhsSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitVectorLoad(il, key.LhsType); + + // Load rhs vector + il.Emit(OpCodes.Ldarg_1); // rhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, rhsSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitVectorLoad(il, key.RhsType); + + // Vector operation + EmitVectorOperation(il, key.Op, key.ResultType); + + // Store result vector + il.Emit(OpCodes.Ldarg_2); // result + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, resultSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitVectorStore(il, key.ResultType); + + // i += vectorCount + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4, vectorCount); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblSimdLoop); + il.MarkLabel(lblSimdLoopEnd); + + // === TAIL LOOP === + il.MarkLabel(lblTailLoop); + + // if (i >= totalSize) goto end + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize + il.Emit(OpCodes.Bge, lblTailLoopEnd); + + // result[i] = op(lhs[i], rhs[i]) + il.Emit(OpCodes.Ldarg_2); // result + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, resultSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + + il.Emit(OpCodes.Ldarg_0); // lhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, lhsSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.LhsType); + + il.Emit(OpCodes.Ldarg_1); // rhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, rhsSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.RhsType); + + EmitScalarOperation(il, key.Op, key.ResultType); + EmitStoreIndirect(il, key.ResultType); + + // i++ + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblTailLoop); + il.MarkLabel(lblTailLoopEnd); + } + + /// + /// Emit loop for scalar right operand (broadcast scalar to array). + /// + private static void EmitScalarRightLoop(ILGenerator il, MixedTypeKernelKey key, + int lhsSize, int rhsSize, int resultSize) + { + var locI = il.DeclareLocal(typeof(int)); // loop counter + var locRhsVal = il.DeclareLocal(GetClrType(key.ResultType)); // scalar value + + var lblLoop = il.DefineLabel(); + var lblLoopEnd = il.DefineLabel(); + + // Load rhs[0] and convert to result type, store in local + il.Emit(OpCodes.Ldarg_1); // rhs + EmitLoadIndirect(il, key.RhsType); + EmitConvertTo(il, key.RhsType, key.ResultType); + il.Emit(OpCodes.Stloc, locRhsVal); + + // i = 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locI); + + il.MarkLabel(lblLoop); + + // if (i >= totalSize) goto end + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize + il.Emit(OpCodes.Bge, lblLoopEnd); + + // result[i] = op(lhs[i], rhsVal) + il.Emit(OpCodes.Ldarg_2); // result + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, resultSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + + // Load lhs[i] and convert + il.Emit(OpCodes.Ldarg_0); // lhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, lhsSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.LhsType); + EmitConvertTo(il, key.LhsType, key.ResultType); + + // Load cached rhs scalar + il.Emit(OpCodes.Ldloc, locRhsVal); + + EmitScalarOperation(il, key.Op, key.ResultType); + EmitStoreIndirect(il, key.ResultType); + + // i++ + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblLoop); + il.MarkLabel(lblLoopEnd); + } + + /// + /// Emit loop for scalar left operand (broadcast scalar to array). + /// + private static void EmitScalarLeftLoop(ILGenerator il, MixedTypeKernelKey key, + int lhsSize, int rhsSize, int resultSize) + { + var locI = il.DeclareLocal(typeof(int)); // loop counter + var locLhsVal = il.DeclareLocal(GetClrType(key.ResultType)); // scalar value + + var lblLoop = il.DefineLabel(); + var lblLoopEnd = il.DefineLabel(); + + // Load lhs[0] and convert to result type, store in local + il.Emit(OpCodes.Ldarg_0); // lhs + EmitLoadIndirect(il, key.LhsType); + EmitConvertTo(il, key.LhsType, key.ResultType); + il.Emit(OpCodes.Stloc, locLhsVal); + + // i = 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locI); + + il.MarkLabel(lblLoop); + + // if (i >= totalSize) goto end + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize + il.Emit(OpCodes.Bge, lblLoopEnd); + + // result[i] = op(lhsVal, rhs[i]) + il.Emit(OpCodes.Ldarg_2); // result + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, resultSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + + // Load cached lhs scalar + il.Emit(OpCodes.Ldloc, locLhsVal); + + // Load rhs[i] and convert + il.Emit(OpCodes.Ldarg_1); // rhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, rhsSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.RhsType); + EmitConvertTo(il, key.RhsType, key.ResultType); + + EmitScalarOperation(il, key.Op, key.ResultType); + EmitStoreIndirect(il, key.ResultType); + + // i++ + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblLoop); + il.MarkLabel(lblLoopEnd); + } + + /// + /// Emit SIMD loop for scalar right operand (broadcast scalar to vector). + /// Requires: LHS type == Result type (no per-element conversion needed). + /// + private static void EmitSimdScalarRightLoop(ILGenerator il, MixedTypeKernelKey key, int elemSize) + { + // Args: void* lhs (0), void* rhs (1), void* result (2), + // int* lhsStrides (3), int* rhsStrides (4), int* shape (5), + // int ndim (6), int totalSize (7) + + int vectorCount = GetVectorCount(key.ResultType); + var clrType = GetClrType(key.ResultType); + var vectorType = GetVectorType(clrType); + + var locI = il.DeclareLocal(typeof(int)); // loop counter + var locVectorEnd = il.DeclareLocal(typeof(int)); // totalSize - vectorCount + var locScalarVec = il.DeclareLocal(vectorType); // broadcasted scalar vector + + var lblSimdLoop = il.DefineLabel(); + var lblSimdLoopEnd = il.DefineLabel(); + var lblTailLoop = il.DefineLabel(); + var lblTailLoopEnd = il.DefineLabel(); + + // === Load scalar, convert to result type, broadcast to vector === + // Load rhs[0] (the scalar) + il.Emit(OpCodes.Ldarg_1); // rhs + EmitLoadIndirect(il, key.RhsType); + // Convert to result type if needed + if (key.RhsType != key.ResultType) + { + EmitConvertTo(il, key.RhsType, key.ResultType); + } + // Broadcast to Vector256: Vector256.Create(scalar) + EmitVectorCreate(il, key.ResultType); + il.Emit(OpCodes.Stloc, locScalarVec); + + // vectorEnd = totalSize - vectorCount + il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize + il.Emit(OpCodes.Ldc_I4, vectorCount); + il.Emit(OpCodes.Sub); + il.Emit(OpCodes.Stloc, locVectorEnd); + + // i = 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locI); + + // === SIMD LOOP === + il.MarkLabel(lblSimdLoop); + + // if (i > vectorEnd) goto SimdLoopEnd + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldloc, locVectorEnd); + il.Emit(OpCodes.Bgt, lblSimdLoopEnd); + + // Load lhs vector: Vector256.Load(lhs + i * elemSize) + il.Emit(OpCodes.Ldarg_0); // lhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, elemSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitVectorLoad(il, key.LhsType); + + // Load scalar vector + il.Emit(OpCodes.Ldloc, locScalarVec); + + // Vector operation: lhsVec op scalarVec + EmitVectorOperation(il, key.Op, key.ResultType); + + // Store result vector: Vector256.Store(resultVec, result + i * elemSize) + il.Emit(OpCodes.Ldarg_2); // result + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, elemSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitVectorStore(il, key.ResultType); + + // i += vectorCount + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4, vectorCount); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblSimdLoop); + il.MarkLabel(lblSimdLoopEnd); + + // === TAIL LOOP (scalar remainder) === + // Load scalar value once for tail loop + var locScalarVal = il.DeclareLocal(clrType); + il.Emit(OpCodes.Ldarg_1); // rhs + EmitLoadIndirect(il, key.RhsType); + if (key.RhsType != key.ResultType) + { + EmitConvertTo(il, key.RhsType, key.ResultType); + } + il.Emit(OpCodes.Stloc, locScalarVal); + + il.MarkLabel(lblTailLoop); + + // if (i >= totalSize) goto end + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize + il.Emit(OpCodes.Bge, lblTailLoopEnd); + + // result[i] = lhs[i] op scalarVal + il.Emit(OpCodes.Ldarg_2); // result + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, elemSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + + il.Emit(OpCodes.Ldarg_0); // lhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, elemSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.LhsType); + + il.Emit(OpCodes.Ldloc, locScalarVal); + + EmitScalarOperation(il, key.Op, key.ResultType); + EmitStoreIndirect(il, key.ResultType); + + // i++ + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblTailLoop); + il.MarkLabel(lblTailLoopEnd); + } + + /// + /// Emit SIMD loop for scalar left operand (broadcast scalar to vector). + /// Requires: RHS type == Result type (no per-element conversion needed). + /// + private static void EmitSimdScalarLeftLoop(ILGenerator il, MixedTypeKernelKey key, int elemSize) + { + // Args: void* lhs (0), void* rhs (1), void* result (2), + // int* lhsStrides (3), int* rhsStrides (4), int* shape (5), + // int ndim (6), int totalSize (7) + + int vectorCount = GetVectorCount(key.ResultType); + var clrType = GetClrType(key.ResultType); + var vectorType = GetVectorType(clrType); + + var locI = il.DeclareLocal(typeof(int)); // loop counter + var locVectorEnd = il.DeclareLocal(typeof(int)); // totalSize - vectorCount + var locScalarVec = il.DeclareLocal(vectorType); // broadcasted scalar vector + + var lblSimdLoop = il.DefineLabel(); + var lblSimdLoopEnd = il.DefineLabel(); + var lblTailLoop = il.DefineLabel(); + var lblTailLoopEnd = il.DefineLabel(); + + // === Load scalar, convert to result type, broadcast to vector === + // Load lhs[0] (the scalar) + il.Emit(OpCodes.Ldarg_0); // lhs + EmitLoadIndirect(il, key.LhsType); + // Convert to result type if needed + if (key.LhsType != key.ResultType) + { + EmitConvertTo(il, key.LhsType, key.ResultType); + } + // Broadcast to Vector256: Vector256.Create(scalar) + EmitVectorCreate(il, key.ResultType); + il.Emit(OpCodes.Stloc, locScalarVec); + + // vectorEnd = totalSize - vectorCount + il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize + il.Emit(OpCodes.Ldc_I4, vectorCount); + il.Emit(OpCodes.Sub); + il.Emit(OpCodes.Stloc, locVectorEnd); + + // i = 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locI); + + // === SIMD LOOP === + il.MarkLabel(lblSimdLoop); + + // if (i > vectorEnd) goto SimdLoopEnd + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldloc, locVectorEnd); + il.Emit(OpCodes.Bgt, lblSimdLoopEnd); + + // Load scalar vector + il.Emit(OpCodes.Ldloc, locScalarVec); + + // Load rhs vector: Vector256.Load(rhs + i * elemSize) + il.Emit(OpCodes.Ldarg_1); // rhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, elemSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitVectorLoad(il, key.RhsType); + + // Vector operation: scalarVec op rhsVec + EmitVectorOperation(il, key.Op, key.ResultType); + + // Store result vector: Vector256.Store(resultVec, result + i * elemSize) + il.Emit(OpCodes.Ldarg_2); // result + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, elemSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitVectorStore(il, key.ResultType); + + // i += vectorCount + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4, vectorCount); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblSimdLoop); + il.MarkLabel(lblSimdLoopEnd); + + // === TAIL LOOP (scalar remainder) === + // Load scalar value once for tail loop + var locScalarVal = il.DeclareLocal(clrType); + il.Emit(OpCodes.Ldarg_0); // lhs + EmitLoadIndirect(il, key.LhsType); + if (key.LhsType != key.ResultType) + { + EmitConvertTo(il, key.LhsType, key.ResultType); + } + il.Emit(OpCodes.Stloc, locScalarVal); + + il.MarkLabel(lblTailLoop); + + // if (i >= totalSize) goto end + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize + il.Emit(OpCodes.Bge, lblTailLoopEnd); + + // result[i] = scalarVal op rhs[i] + il.Emit(OpCodes.Ldarg_2); // result + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, elemSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + + il.Emit(OpCodes.Ldloc, locScalarVal); + + il.Emit(OpCodes.Ldarg_1); // rhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, elemSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.RhsType); + + EmitScalarOperation(il, key.Op, key.ResultType); + EmitStoreIndirect(il, key.ResultType); + + // i++ + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblTailLoop); + il.MarkLabel(lblTailLoopEnd); + } + + /// + /// Emit chunked loop for inner-contiguous arrays. + /// This is more complex - processes the inner dimension as a chunk. + /// + private static void EmitChunkLoop(ILGenerator il, MixedTypeKernelKey key, + int lhsSize, int rhsSize, int resultSize) + { + // For simplicity in initial implementation, use general loop + // TODO: Implement proper chunked SIMD processing + EmitGeneralLoop(il, key, lhsSize, rhsSize, resultSize); + } + + /// + /// Emit general coordinate-based iteration loop. + /// Handles arbitrary strides. + /// + private static void EmitGeneralLoop(ILGenerator il, MixedTypeKernelKey key, + int lhsSize, int rhsSize, int resultSize) + { + // Args: void* lhs (0), void* rhs (1), void* result (2), + // int* lhsStrides (3), int* rhsStrides (4), int* shape (5), + // int ndim (6), int totalSize (7) + + var locI = il.DeclareLocal(typeof(int)); // linear index + var locD = il.DeclareLocal(typeof(int)); // dimension counter + var locLhsOffset = il.DeclareLocal(typeof(int)); // lhs offset + var locRhsOffset = il.DeclareLocal(typeof(int)); // rhs offset + var locCoord = il.DeclareLocal(typeof(int)); // current coordinate + var locIdx = il.DeclareLocal(typeof(int)); // temp for coordinate calculation + + var lblLoop = il.DefineLabel(); + var lblLoopEnd = il.DefineLabel(); + var lblDimLoop = il.DefineLabel(); + var lblDimLoopEnd = il.DefineLabel(); + + // i = 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locI); + + // Main loop + il.MarkLabel(lblLoop); + + // if (i >= totalSize) goto end + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize + il.Emit(OpCodes.Bge, lblLoopEnd); + + // Calculate lhsOffset and rhsOffset from linear index + // lhsOffset = 0, rhsOffset = 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locLhsOffset); + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locRhsOffset); + + // idx = i (for coordinate calculation) + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Stloc, locIdx); + + // For each dimension (right to left): coord = idx % shape[d], idx /= shape[d] + // d = ndim - 1 + il.Emit(OpCodes.Ldarg_S, (byte)6); // ndim + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Sub); + il.Emit(OpCodes.Stloc, locD); + + il.MarkLabel(lblDimLoop); + + // if (d < 0) goto DimLoopEnd + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Blt, lblDimLoopEnd); + + // coord = idx % shape[d] + il.Emit(OpCodes.Ldloc, locIdx); + il.Emit(OpCodes.Ldarg_S, (byte)5); // shape + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4_4); // sizeof(int) + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Ldind_I4); + il.Emit(OpCodes.Rem); + il.Emit(OpCodes.Stloc, locCoord); + + // idx /= shape[d] + il.Emit(OpCodes.Ldloc, locIdx); + il.Emit(OpCodes.Ldarg_S, (byte)5); // shape + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4_4); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Ldind_I4); + il.Emit(OpCodes.Div); + il.Emit(OpCodes.Stloc, locIdx); + + // lhsOffset += coord * lhsStrides[d] + il.Emit(OpCodes.Ldloc, locLhsOffset); + il.Emit(OpCodes.Ldloc, locCoord); + il.Emit(OpCodes.Ldarg_3); // lhsStrides + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4_4); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Ldind_I4); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locLhsOffset); + + // rhsOffset += coord * rhsStrides[d] + il.Emit(OpCodes.Ldloc, locRhsOffset); + il.Emit(OpCodes.Ldloc, locCoord); + il.Emit(OpCodes.Ldarg_S, (byte)4); // rhsStrides + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4_4); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Ldind_I4); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locRhsOffset); + + // d-- + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Sub); + il.Emit(OpCodes.Stloc, locD); + + il.Emit(OpCodes.Br, lblDimLoop); + il.MarkLabel(lblDimLoopEnd); + + // Now compute: result[i] = op(lhs[lhsOffset], rhs[rhsOffset]) + // Load result address (contiguous output) + il.Emit(OpCodes.Ldarg_2); // result + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, resultSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + + // Load lhs[lhsOffset] + il.Emit(OpCodes.Ldarg_0); // lhs + il.Emit(OpCodes.Ldloc, locLhsOffset); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, lhsSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.LhsType); + EmitConvertTo(il, key.LhsType, key.ResultType); + + // Load rhs[rhsOffset] + il.Emit(OpCodes.Ldarg_1); // rhs + il.Emit(OpCodes.Ldloc, locRhsOffset); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, rhsSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.RhsType); + EmitConvertTo(il, key.RhsType, key.ResultType); + + // Operation + EmitScalarOperation(il, key.Op, key.ResultType); + + // Store + EmitStoreIndirect(il, key.ResultType); + + // i++ + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblLoop); + il.MarkLabel(lblLoopEnd); + } + + #endregion + } +} diff --git a/src/NumSharp.Core/Backends/Kernels/ILKernelGenerator.Reduction.cs b/src/NumSharp.Core/Backends/Kernels/ILKernelGenerator.Reduction.cs new file mode 100644 index 00000000..774328c5 --- /dev/null +++ b/src/NumSharp.Core/Backends/Kernels/ILKernelGenerator.Reduction.cs @@ -0,0 +1,1073 @@ +using System; +using System.Collections.Concurrent; +using System.Linq; +using System.Reflection; +using System.Reflection.Emit; +using System.Runtime.Intrinsics; + +namespace NumSharp.Backends.Kernels +{ + public static partial class ILKernelGenerator + { + #region Reduction Kernel Generation + + /// + /// Cache for element-wise reduction kernels. + /// Key: ElementReductionKernelKey + /// + private static readonly ConcurrentDictionary _elementReductionCache = new(); + + /// + /// Number of element reduction kernels in cache. + /// + public static int ElementReductionCachedCount => _elementReductionCache.Count; + + /// + /// Clear the reduction kernel caches. + /// + public static void ClearReduction() + { + _elementReductionCache.Clear(); + } + + /// + /// Get or generate a typed element-wise reduction kernel. + /// Returns a delegate that reduces all elements to a single value of type TResult. + /// + public static TypedElementReductionKernel GetTypedElementReductionKernel(ElementReductionKernelKey key) + where TResult : unmanaged + { + if (!Enabled) + throw new InvalidOperationException("IL generation is disabled"); + + var kernel = _elementReductionCache.GetOrAdd(key, GenerateTypedElementReductionKernel); + return (TypedElementReductionKernel)kernel; + } + + /// + /// Try to get or generate an element reduction kernel. + /// + public static TypedElementReductionKernel? TryGetTypedElementReductionKernel(ElementReductionKernelKey key) + where TResult : unmanaged + { + if (!Enabled) + return null; + + try + { + var kernel = _elementReductionCache.GetOrAdd(key, GenerateTypedElementReductionKernel); + return (TypedElementReductionKernel)kernel; + } + catch + { + return null; + } + } + + /// + /// Generate a typed element-wise reduction kernel. + /// + private static Delegate GenerateTypedElementReductionKernel(ElementReductionKernelKey key) + where TResult : unmanaged + { + // TypedElementReductionKernel signature: + // TResult(void* input, int* strides, int* shape, int ndim, int totalSize) + var dm = new DynamicMethod( + name: $"ElemReduce_{key}", + returnType: typeof(TResult), + parameterTypes: new[] + { + typeof(void*), typeof(int*), typeof(int*), typeof(int), typeof(int) + }, + owner: typeof(ILKernelGenerator), + skipVisibility: true + ); + + var il = dm.GetILGenerator(); + + int inputSize = GetTypeSize(key.InputType); + int accumSize = GetTypeSize(key.AccumulatorType); + + if (key.IsContiguous) + { + // Check if we can use SIMD + bool canSimd = CanUseReductionSimd(key); + if (canSimd) + { + EmitReductionSimdLoop(il, key, inputSize); + } + else + { + EmitReductionScalarLoop(il, key, inputSize); + } + } + else + { + EmitReductionStridedLoop(il, key, inputSize); + } + + il.Emit(OpCodes.Ret); + return dm.CreateDelegate>(); + } + + /// + /// Check if SIMD can be used for this reduction operation. + /// + private static bool CanUseReductionSimd(ElementReductionKernelKey key) + { + // Must be contiguous + if (!key.IsContiguous) + return false; + + // SIMD for numeric types (not bool, char, decimal) + if (!CanUseSimd(key.InputType)) + return false; + + // Only certain operations have SIMD support + // Sum: Vector.Sum() or manual horizontal add + // Max/Min: Reduce vector then scalar reduce remainder + // Prod: Manual horizontal multiply + // ArgMax/ArgMin: Need to track indices, more complex + return key.Op == ReductionOp.Sum || key.Op == ReductionOp.Max || key.Op == ReductionOp.Min || + key.Op == ReductionOp.Prod; + } + + /// + /// Emit a SIMD reduction loop for contiguous arrays. + /// Uses Vector256 for horizontal reductions. + /// + private static void EmitReductionSimdLoop(ILGenerator il, ElementReductionKernelKey key, int inputSize) + { + int vectorCount = GetVectorCount(key.InputType); + + var locI = il.DeclareLocal(typeof(int)); // loop counter + var locVectorEnd = il.DeclareLocal(typeof(int)); // totalSize - vectorCount + var locAccum = il.DeclareLocal(GetClrType(key.AccumulatorType)); // scalar accumulator + + var lblSimdLoop = il.DefineLabel(); + var lblSimdLoopEnd = il.DefineLabel(); + var lblTailLoop = il.DefineLabel(); + var lblTailLoopEnd = il.DefineLabel(); + + // Initialize accumulator with identity value + EmitLoadIdentity(il, key.Op, key.AccumulatorType); + il.Emit(OpCodes.Stloc, locAccum); + + // vectorEnd = totalSize - vectorCount + il.Emit(OpCodes.Ldarg_S, (byte)4); // totalSize + il.Emit(OpCodes.Ldc_I4, vectorCount); + il.Emit(OpCodes.Sub); + il.Emit(OpCodes.Stloc, locVectorEnd); + + // i = 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locI); + + // === SIMD LOOP === + il.MarkLabel(lblSimdLoop); + + // if (i > vectorEnd) goto SimdLoopEnd + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldloc, locVectorEnd); + il.Emit(OpCodes.Bgt, lblSimdLoopEnd); + + // Load vector from input[i] + il.Emit(OpCodes.Ldarg_0); // input + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, inputSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitVectorLoad(il, key.InputType); + + // Perform horizontal reduction on vector and combine with accumulator + EmitVectorHorizontalReduction(il, key.Op, key.InputType); + + // Combine with accumulator + il.Emit(OpCodes.Ldloc, locAccum); + EmitReductionCombine(il, key.Op, key.AccumulatorType); + il.Emit(OpCodes.Stloc, locAccum); + + // i += vectorCount + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4, vectorCount); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblSimdLoop); + il.MarkLabel(lblSimdLoopEnd); + + // === TAIL LOOP === + il.MarkLabel(lblTailLoop); + + // if (i >= totalSize) goto end + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldarg_S, (byte)4); // totalSize + il.Emit(OpCodes.Bge, lblTailLoopEnd); + + // Load input[i], convert to accumulator type + il.Emit(OpCodes.Ldarg_0); // input + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, inputSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.InputType); + EmitConvertTo(il, key.InputType, key.AccumulatorType); + + // Combine with accumulator + il.Emit(OpCodes.Ldloc, locAccum); + EmitReductionCombine(il, key.Op, key.AccumulatorType); + il.Emit(OpCodes.Stloc, locAccum); + + // i++ + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblTailLoop); + il.MarkLabel(lblTailLoopEnd); + + // Return accumulator + il.Emit(OpCodes.Ldloc, locAccum); + } + + /// + /// Emit a scalar reduction loop for contiguous arrays (no SIMD). + /// + private static void EmitReductionScalarLoop(ILGenerator il, ElementReductionKernelKey key, int inputSize) + { + // Args: void* input (0), int* strides (1), int* shape (2), int ndim (3), int totalSize (4) + + var locI = il.DeclareLocal(typeof(int)); // loop counter + var locAccum = il.DeclareLocal(GetClrType(key.AccumulatorType)); // accumulator + var locIdx = il.DeclareLocal(typeof(int)); // index for ArgMax/ArgMin + + var lblLoop = il.DefineLabel(); + var lblLoopEnd = il.DefineLabel(); + + // Initialize accumulator with identity value + EmitLoadIdentity(il, key.Op, key.AccumulatorType); + il.Emit(OpCodes.Stloc, locAccum); + + // For ArgMax/ArgMin, initialize index to 0 + if (key.Op == ReductionOp.ArgMax || key.Op == ReductionOp.ArgMin) + { + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locIdx); + } + + // i = 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locI); + + il.MarkLabel(lblLoop); + + // if (i >= totalSize) goto end + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldarg_S, (byte)4); // totalSize + il.Emit(OpCodes.Bge, lblLoopEnd); + + // Load input[i], convert to accumulator type + il.Emit(OpCodes.Ldarg_0); // input + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, inputSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.InputType); + EmitConvertTo(il, key.InputType, key.AccumulatorType); + + // Combine with accumulator (and track index for ArgMax/ArgMin) + if (key.Op == ReductionOp.ArgMax || key.Op == ReductionOp.ArgMin) + { + EmitArgReductionStep(il, key.Op, key.AccumulatorType, locAccum, locIdx, locI); + } + else + { + il.Emit(OpCodes.Ldloc, locAccum); + EmitReductionCombine(il, key.Op, key.AccumulatorType); + il.Emit(OpCodes.Stloc, locAccum); + } + + // i++ + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblLoop); + il.MarkLabel(lblLoopEnd); + + // Return accumulator or index + if (key.Op == ReductionOp.ArgMax || key.Op == ReductionOp.ArgMin) + { + il.Emit(OpCodes.Ldloc, locIdx); + } + else + { + il.Emit(OpCodes.Ldloc, locAccum); + } + } + + /// + /// Emit a strided reduction loop for non-contiguous arrays. + /// + private static void EmitReductionStridedLoop(ILGenerator il, ElementReductionKernelKey key, int inputSize) + { + // Args: void* input (0), int* strides (1), int* shape (2), int ndim (3), int totalSize (4) + + var locI = il.DeclareLocal(typeof(int)); // linear index + var locD = il.DeclareLocal(typeof(int)); // dimension counter + var locOffset = il.DeclareLocal(typeof(int)); // input offset + var locCoord = il.DeclareLocal(typeof(int)); // current coordinate + var locIdx = il.DeclareLocal(typeof(int)); // temp for coordinate calculation + var locAccum = il.DeclareLocal(GetClrType(key.AccumulatorType)); // accumulator + var locArgIdx = il.DeclareLocal(typeof(int)); // index for ArgMax/ArgMin + + var lblLoop = il.DefineLabel(); + var lblLoopEnd = il.DefineLabel(); + var lblDimLoop = il.DefineLabel(); + var lblDimLoopEnd = il.DefineLabel(); + + // Initialize accumulator + EmitLoadIdentity(il, key.Op, key.AccumulatorType); + il.Emit(OpCodes.Stloc, locAccum); + + // For ArgMax/ArgMin, initialize index to 0 + if (key.Op == ReductionOp.ArgMax || key.Op == ReductionOp.ArgMin) + { + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locArgIdx); + } + + // i = 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locI); + + // Main loop + il.MarkLabel(lblLoop); + + // if (i >= totalSize) goto end + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldarg_S, (byte)4); // totalSize + il.Emit(OpCodes.Bge, lblLoopEnd); + + // Calculate offset from linear index + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locOffset); + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Stloc, locIdx); + + // d = ndim - 1 + il.Emit(OpCodes.Ldarg_3); // ndim + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Sub); + il.Emit(OpCodes.Stloc, locD); + + il.MarkLabel(lblDimLoop); + + // if (d < 0) goto DimLoopEnd + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Blt, lblDimLoopEnd); + + // coord = idx % shape[d] + il.Emit(OpCodes.Ldloc, locIdx); + il.Emit(OpCodes.Ldarg_2); // shape + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4_4); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Ldind_I4); + il.Emit(OpCodes.Rem); + il.Emit(OpCodes.Stloc, locCoord); + + // idx /= shape[d] + il.Emit(OpCodes.Ldloc, locIdx); + il.Emit(OpCodes.Ldarg_2); // shape + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4_4); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Ldind_I4); + il.Emit(OpCodes.Div); + il.Emit(OpCodes.Stloc, locIdx); + + // offset += coord * strides[d] + il.Emit(OpCodes.Ldloc, locOffset); + il.Emit(OpCodes.Ldloc, locCoord); + il.Emit(OpCodes.Ldarg_1); // strides + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4_4); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Ldind_I4); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locOffset); + + // d-- + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Sub); + il.Emit(OpCodes.Stloc, locD); + + il.Emit(OpCodes.Br, lblDimLoop); + il.MarkLabel(lblDimLoopEnd); + + // Load input[offset] + il.Emit(OpCodes.Ldarg_0); // input + il.Emit(OpCodes.Ldloc, locOffset); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, inputSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.InputType); + EmitConvertTo(il, key.InputType, key.AccumulatorType); + + // Combine with accumulator + if (key.Op == ReductionOp.ArgMax || key.Op == ReductionOp.ArgMin) + { + EmitArgReductionStep(il, key.Op, key.AccumulatorType, locAccum, locArgIdx, locI); + } + else + { + il.Emit(OpCodes.Ldloc, locAccum); + EmitReductionCombine(il, key.Op, key.AccumulatorType); + il.Emit(OpCodes.Stloc, locAccum); + } + + // i++ + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblLoop); + il.MarkLabel(lblLoopEnd); + + // Return accumulator or index + if (key.Op == ReductionOp.ArgMax || key.Op == ReductionOp.ArgMin) + { + il.Emit(OpCodes.Ldloc, locArgIdx); + } + else + { + il.Emit(OpCodes.Ldloc, locAccum); + } + } + + #region Reduction IL Helpers + + /// + /// Load the identity value for a reduction operation. + /// + private static void EmitLoadIdentity(ILGenerator il, ReductionOp op, NPTypeCode type) + { + switch (op) + { + case ReductionOp.Sum: + case ReductionOp.Mean: + case ReductionOp.CumSum: + // Identity is 0 + EmitLoadZero(il, type); + break; + + case ReductionOp.Prod: + // Identity is 1 + EmitLoadOne(il, type); + break; + + case ReductionOp.Max: + // Identity is minimum value (so first element becomes max) + EmitLoadMinValue(il, type); + break; + + case ReductionOp.Min: + // Identity is maximum value (so first element becomes min) + EmitLoadMaxValue(il, type); + break; + + case ReductionOp.ArgMax: + case ReductionOp.ArgMin: + // For ArgMax/ArgMin, accumulator holds current best value + // Initialize with first element value (handled separately) + if (op == ReductionOp.ArgMax) + EmitLoadMinValue(il, type); + else + EmitLoadMaxValue(il, type); + break; + + default: + throw new NotSupportedException($"Identity for {op} not supported"); + } + } + + /// + /// Load zero for a type. + /// + private static void EmitLoadZero(ILGenerator il, NPTypeCode type) + { + switch (type) + { + case NPTypeCode.Boolean: + case NPTypeCode.Byte: + case NPTypeCode.Int16: + case NPTypeCode.UInt16: + case NPTypeCode.Char: + case NPTypeCode.Int32: + case NPTypeCode.UInt32: + il.Emit(OpCodes.Ldc_I4_0); + break; + case NPTypeCode.Int64: + case NPTypeCode.UInt64: + il.Emit(OpCodes.Ldc_I8, 0L); + break; + case NPTypeCode.Single: + il.Emit(OpCodes.Ldc_R4, 0f); + break; + case NPTypeCode.Double: + il.Emit(OpCodes.Ldc_R8, 0d); + break; + case NPTypeCode.Decimal: + il.Emit(OpCodes.Ldsfld, typeof(decimal).GetField("Zero")!); + break; + default: + throw new NotSupportedException($"Type {type} not supported"); + } + } + + /// + /// Load one for a type. + /// + private static void EmitLoadOne(ILGenerator il, NPTypeCode type) + { + switch (type) + { + case NPTypeCode.Boolean: + case NPTypeCode.Byte: + case NPTypeCode.Int16: + case NPTypeCode.UInt16: + case NPTypeCode.Char: + case NPTypeCode.Int32: + case NPTypeCode.UInt32: + il.Emit(OpCodes.Ldc_I4_1); + break; + case NPTypeCode.Int64: + case NPTypeCode.UInt64: + il.Emit(OpCodes.Ldc_I8, 1L); + break; + case NPTypeCode.Single: + il.Emit(OpCodes.Ldc_R4, 1f); + break; + case NPTypeCode.Double: + il.Emit(OpCodes.Ldc_R8, 1d); + break; + case NPTypeCode.Decimal: + il.Emit(OpCodes.Ldsfld, typeof(decimal).GetField("One")!); + break; + default: + throw new NotSupportedException($"Type {type} not supported"); + } + } + + /// + /// Load minimum value for a type. + /// + private static void EmitLoadMinValue(ILGenerator il, NPTypeCode type) + { + switch (type) + { + case NPTypeCode.Byte: + il.Emit(OpCodes.Ldc_I4, (int)byte.MinValue); + break; + case NPTypeCode.Int16: + il.Emit(OpCodes.Ldc_I4, (int)short.MinValue); + break; + case NPTypeCode.UInt16: + case NPTypeCode.Char: + il.Emit(OpCodes.Ldc_I4, (int)ushort.MinValue); + break; + case NPTypeCode.Int32: + il.Emit(OpCodes.Ldc_I4, int.MinValue); + break; + case NPTypeCode.UInt32: + il.Emit(OpCodes.Ldc_I4, unchecked((int)uint.MinValue)); + break; + case NPTypeCode.Int64: + il.Emit(OpCodes.Ldc_I8, long.MinValue); + break; + case NPTypeCode.UInt64: + il.Emit(OpCodes.Ldc_I8, unchecked((long)ulong.MinValue)); + break; + case NPTypeCode.Single: + il.Emit(OpCodes.Ldc_R4, float.NegativeInfinity); + break; + case NPTypeCode.Double: + il.Emit(OpCodes.Ldc_R8, double.NegativeInfinity); + break; + case NPTypeCode.Decimal: + il.Emit(OpCodes.Ldsfld, typeof(decimal).GetField("MinValue")!); + break; + default: + throw new NotSupportedException($"Type {type} not supported"); + } + } + + /// + /// Load maximum value for a type. + /// + private static void EmitLoadMaxValue(ILGenerator il, NPTypeCode type) + { + switch (type) + { + case NPTypeCode.Byte: + il.Emit(OpCodes.Ldc_I4, (int)byte.MaxValue); + break; + case NPTypeCode.Int16: + il.Emit(OpCodes.Ldc_I4, (int)short.MaxValue); + break; + case NPTypeCode.UInt16: + case NPTypeCode.Char: + il.Emit(OpCodes.Ldc_I4, (int)ushort.MaxValue); + break; + case NPTypeCode.Int32: + il.Emit(OpCodes.Ldc_I4, int.MaxValue); + break; + case NPTypeCode.UInt32: + il.Emit(OpCodes.Ldc_I4, unchecked((int)uint.MaxValue)); + break; + case NPTypeCode.Int64: + il.Emit(OpCodes.Ldc_I8, long.MaxValue); + break; + case NPTypeCode.UInt64: + il.Emit(OpCodes.Ldc_I8, unchecked((long)ulong.MaxValue)); + break; + case NPTypeCode.Single: + il.Emit(OpCodes.Ldc_R4, float.PositiveInfinity); + break; + case NPTypeCode.Double: + il.Emit(OpCodes.Ldc_R8, double.PositiveInfinity); + break; + case NPTypeCode.Decimal: + il.Emit(OpCodes.Ldsfld, typeof(decimal).GetField("MaxValue")!); + break; + default: + throw new NotSupportedException($"Type {type} not supported"); + } + } + + /// + /// Emit horizontal reduction of a Vector (adapts to V128/V256/V512). + /// Stack has Vector, result is scalar reduction. + /// + private static void EmitVectorHorizontalReduction(ILGenerator il, ReductionOp op, NPTypeCode type) + { + var containerType = GetVectorContainerType(); + var clrType = GetClrType(type); + var vectorType = GetVectorType(clrType); + + switch (op) + { + case ReductionOp.Sum: + // Use Vector.Sum() + var sumMethod = containerType.GetMethods(BindingFlags.Public | BindingFlags.Static) + .Where(m => m.Name == "Sum" && m.IsGenericMethod && m.GetParameters().Length == 1) + .Select(m => m.MakeGenericMethod(clrType)) + .FirstOrDefault(m => m.GetParameters()[0].ParameterType == vectorType); + + if (sumMethod != null) + { + il.EmitCall(OpCodes.Call, sumMethod, null); + } + else + { + // Fallback: manual horizontal add using GetElement + EmitManualHorizontalSum(il, type); + } + break; + + case ReductionOp.Max: + case ReductionOp.Min: + // No built-in horizontal max/min, need to reduce manually + EmitManualHorizontalMinMax(il, op, type); + break; + + case ReductionOp.Prod: + // Manual horizontal multiply + EmitManualHorizontalProd(il, type); + break; + + default: + throw new NotSupportedException($"SIMD horizontal reduction for {op} not supported"); + } + } + + /// + /// Emit manual horizontal sum using tree reduction (O(log N) instead of O(N)). + /// Uses GetLower/GetUpper + Add to reduce vector width by half each step. + /// + private static void EmitManualHorizontalSum(ILGenerator il, NPTypeCode type) + { + var clrType = GetClrType(type); + + // Tree reduction: reduce vector width by half each iteration + // Vector512 -> Vector256 -> Vector128 -> scalar + EmitTreeReduction(il, type, ReductionOp.Sum); + } + + /// + /// Emit manual horizontal min/max using tree reduction (O(log N) instead of O(N)). + /// Uses GetLower/GetUpper + Min/Max to reduce vector width by half each step. + /// + private static void EmitManualHorizontalMinMax(ILGenerator il, ReductionOp op, NPTypeCode type) + { + // Tree reduction: reduce vector width by half each iteration + EmitTreeReduction(il, type, op); + } + + /// + /// Emit manual horizontal product using tree reduction (O(log N) instead of O(N)). + /// Uses GetLower/GetUpper + Multiply to reduce vector width by half each step. + /// + private static void EmitManualHorizontalProd(ILGenerator il, NPTypeCode type) + { + // Tree reduction: reduce vector width by half each iteration + EmitTreeReduction(il, type, ReductionOp.Prod); + } + + /// + /// Get the Math.Max or Math.Min method for a type. + /// + private static MethodInfo? GetMathMinMaxMethod(ReductionOp op, Type clrType) + { + string name = op == ReductionOp.Max ? "Max" : "Min"; + return typeof(Math).GetMethod(name, new[] { clrType, clrType }); + } + + /// + /// Emit tree reduction for horizontal operations (Sum, Min, Max, Prod). + /// Uses GetLower/GetUpper to halve vector width each step: O(log N) vs O(N). + /// Stack has vector on entry, scalar result on exit. + /// + private static void EmitTreeReduction(ILGenerator il, NPTypeCode type, ReductionOp op) + { + var clrType = GetClrType(type); + int currentBits = VectorBits; + + // Step 1: Reduce from current width down to 128-bit using GetLower/GetUpper + op + while (currentBits > 128) + { + int nextBits = currentBits / 2; + var currentContainer = currentBits switch + { + 512 => typeof(Vector512), + 256 => typeof(Vector256), + _ => throw new InvalidOperationException() + }; + var nextContainer = nextBits switch + { + 256 => typeof(Vector256), + 128 => typeof(Vector128), + _ => throw new InvalidOperationException() + }; + var currentVecType = currentBits switch + { + 512 => typeof(Vector512<>).MakeGenericType(clrType), + 256 => typeof(Vector256<>).MakeGenericType(clrType), + _ => throw new InvalidOperationException() + }; + var nextVecType = nextBits switch + { + 256 => typeof(Vector256<>).MakeGenericType(clrType), + 128 => typeof(Vector128<>).MakeGenericType(clrType), + _ => throw new InvalidOperationException() + }; + + // Store current vector + var locVec = il.DeclareLocal(currentVecType); + il.Emit(OpCodes.Stloc, locVec); + + // GetLower (returns half-width vector) + var getLowerMethod = currentContainer.GetMethods(BindingFlags.Public | BindingFlags.Static) + .Where(m => m.Name == "GetLower" && m.IsGenericMethod) + .Select(m => m.MakeGenericMethod(clrType)) + .First(); + il.Emit(OpCodes.Ldloc, locVec); + il.EmitCall(OpCodes.Call, getLowerMethod, null); + + // GetUpper + var getUpperMethod = currentContainer.GetMethods(BindingFlags.Public | BindingFlags.Static) + .Where(m => m.Name == "GetUpper" && m.IsGenericMethod) + .Select(m => m.MakeGenericMethod(clrType)) + .First(); + il.Emit(OpCodes.Ldloc, locVec); + il.EmitCall(OpCodes.Call, getUpperMethod, null); + + // Apply reduction operation on the two half-vectors + EmitVectorReductionOp(il, op, nextContainer, nextVecType, clrType); + + currentBits = nextBits; + } + + // Step 2: Now we have Vector128. Reduce to scalar. + // Vector128 has 2-16 elements depending on type. Use GetElement for final few. + var vec128Type = typeof(Vector128<>).MakeGenericType(clrType); + int elemCount = 16 / GetTypeSize(type); // Vector128 is 16 bytes + + var locFinal = il.DeclareLocal(vec128Type); + il.Emit(OpCodes.Stloc, locFinal); + + // Get first element as accumulator + var getElementMethod = typeof(Vector128).GetMethods(BindingFlags.Public | BindingFlags.Static) + .Where(m => m.Name == "GetElement" && m.IsGenericMethod) + .Select(m => m.MakeGenericMethod(clrType)) + .First(); + + il.Emit(OpCodes.Ldloc, locFinal); + il.Emit(OpCodes.Ldc_I4_0); + il.EmitCall(OpCodes.Call, getElementMethod, null); + + // Reduce remaining elements (only 1-3 more for most types) + for (int i = 1; i < elemCount; i++) + { + il.Emit(OpCodes.Ldloc, locFinal); + il.Emit(OpCodes.Ldc_I4, i); + il.EmitCall(OpCodes.Call, getElementMethod, null); + EmitScalarReductionOp(il, op, type); + } + } + + /// + /// Emit vector reduction operation (Add, Min, Max, Multiply). + /// Stack has [vec1, vec2], result is combined vector. + /// + private static void EmitVectorReductionOp(ILGenerator il, ReductionOp op, + Type containerType, Type vectorType, Type clrType) + { + string methodName = op switch + { + ReductionOp.Sum => "Add", + ReductionOp.Min => "Min", + ReductionOp.Max => "Max", + ReductionOp.Prod => "Multiply", + _ => throw new NotSupportedException($"Reduction {op} not supported for tree reduction") + }; + + var method = containerType.GetMethods(BindingFlags.Public | BindingFlags.Static) + .Where(m => m.Name == methodName && m.IsGenericMethod && m.GetParameters().Length == 2) + .Select(m => m.MakeGenericMethod(clrType)) + .FirstOrDefault(m => m.GetParameters()[0].ParameterType == vectorType); + + if (method == null) + throw new InvalidOperationException($"Could not find {containerType.Name}.{methodName}<{clrType.Name}>"); + + il.EmitCall(OpCodes.Call, method, null); + } + + /// + /// Emit scalar reduction operation. + /// Stack has [accum, value], result is combined scalar. + /// + private static void EmitScalarReductionOp(ILGenerator il, ReductionOp op, NPTypeCode type) + { + switch (op) + { + case ReductionOp.Sum: + il.Emit(OpCodes.Add); + break; + case ReductionOp.Prod: + il.Emit(OpCodes.Mul); + break; + case ReductionOp.Min: + case ReductionOp.Max: + var mathMethod = GetMathMinMaxMethod(op, GetClrType(type)); + if (mathMethod != null) + { + il.EmitCall(OpCodes.Call, mathMethod, null); + } + else + { + EmitScalarMinMax(il, op, type); + } + break; + default: + throw new NotSupportedException($"Scalar reduction {op} not supported"); + } + } + + /// + /// Emit scalar min/max comparison. + /// Stack has [value1, value2], result is min or max. + /// + private static void EmitScalarMinMax(ILGenerator il, ReductionOp op, NPTypeCode type) + { + // Use comparison: (a > b) ? a : b for Max, (a < b) ? a : b for Min + var locA = il.DeclareLocal(GetClrType(type)); + var locB = il.DeclareLocal(GetClrType(type)); + var lblFalse = il.DefineLabel(); + var lblEnd = il.DefineLabel(); + + il.Emit(OpCodes.Stloc, locB); + il.Emit(OpCodes.Stloc, locA); + + il.Emit(OpCodes.Ldloc, locA); + il.Emit(OpCodes.Ldloc, locB); + + if (op == ReductionOp.Max) + { + if (IsUnsigned(type)) + il.Emit(OpCodes.Bgt_Un, lblFalse); + else + il.Emit(OpCodes.Bgt, lblFalse); + + // a <= b, return b + il.Emit(OpCodes.Ldloc, locB); + il.Emit(OpCodes.Br, lblEnd); + + il.MarkLabel(lblFalse); + // a > b, return a + il.Emit(OpCodes.Ldloc, locA); + } + else + { + if (IsUnsigned(type)) + il.Emit(OpCodes.Blt_Un, lblFalse); + else + il.Emit(OpCodes.Blt, lblFalse); + + // a >= b, return b + il.Emit(OpCodes.Ldloc, locB); + il.Emit(OpCodes.Br, lblEnd); + + il.MarkLabel(lblFalse); + // a < b, return a + il.Emit(OpCodes.Ldloc, locA); + } + + il.MarkLabel(lblEnd); + } + + /// + /// Emit reduction combine operation. + /// Stack has [newValue, accumulator], result is combined value. + /// + private static void EmitReductionCombine(ILGenerator il, ReductionOp op, NPTypeCode type) + { + switch (op) + { + case ReductionOp.Sum: + case ReductionOp.Mean: + case ReductionOp.CumSum: + // Add + if (type == NPTypeCode.Decimal) + { + il.EmitCall(OpCodes.Call, typeof(decimal).GetMethod("op_Addition", new[] { typeof(decimal), typeof(decimal) })!, null); + } + else + { + il.Emit(OpCodes.Add); + } + break; + + case ReductionOp.Prod: + // Multiply + if (type == NPTypeCode.Decimal) + { + il.EmitCall(OpCodes.Call, typeof(decimal).GetMethod("op_Multiply", new[] { typeof(decimal), typeof(decimal) })!, null); + } + else + { + il.Emit(OpCodes.Mul); + } + break; + + case ReductionOp.Max: + { + var clrType = GetClrType(type); + var mathMethod = GetMathMinMaxMethod(op, clrType); + if (mathMethod != null) + { + il.EmitCall(OpCodes.Call, mathMethod, null); + } + else + { + EmitScalarMinMax(il, op, type); + } + } + break; + + case ReductionOp.Min: + { + var clrType = GetClrType(type); + var mathMethod = GetMathMinMaxMethod(op, clrType); + if (mathMethod != null) + { + il.EmitCall(OpCodes.Call, mathMethod, null); + } + else + { + EmitScalarMinMax(il, op, type); + } + } + break; + + default: + throw new NotSupportedException($"Reduction combine for {op} not supported"); + } + } + + /// + /// Emit ArgMax/ArgMin step - compare new value with accumulator, update index if better. + /// Stack has [newValue]. Updates locAccum and locIdx. + /// + private static void EmitArgReductionStep(ILGenerator il, ReductionOp op, NPTypeCode type, + LocalBuilder locAccum, LocalBuilder locIdx, LocalBuilder locI) + { + // newValue is on stack, compare with locAccum + var lblSkip = il.DefineLabel(); + + il.Emit(OpCodes.Dup); // [newValue, newValue] + il.Emit(OpCodes.Ldloc, locAccum); // [newValue, newValue, accum] + + // Compare: newValue > accum (for ArgMax) or newValue < accum (for ArgMin) + if (op == ReductionOp.ArgMax) + { + if (IsUnsigned(type)) + il.Emit(OpCodes.Ble_Un, lblSkip); + else + il.Emit(OpCodes.Ble, lblSkip); + } + else // ArgMin + { + if (IsUnsigned(type)) + il.Emit(OpCodes.Bge_Un, lblSkip); + else + il.Emit(OpCodes.Bge, lblSkip); + } + + // Update: newValue is better + // Stack has [newValue] + il.Emit(OpCodes.Stloc, locAccum); // accum = newValue + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Stloc, locIdx); // idx = i + var lblEnd = il.DefineLabel(); + il.Emit(OpCodes.Br, lblEnd); + + il.MarkLabel(lblSkip); + // Not better, pop newValue + il.Emit(OpCodes.Pop); + + il.MarkLabel(lblEnd); + } + + #endregion + + #endregion + } +} diff --git a/src/NumSharp.Core/Backends/Kernels/ILKernelGenerator.Unary.cs b/src/NumSharp.Core/Backends/Kernels/ILKernelGenerator.Unary.cs new file mode 100644 index 00000000..5f97149a --- /dev/null +++ b/src/NumSharp.Core/Backends/Kernels/ILKernelGenerator.Unary.cs @@ -0,0 +1,1199 @@ +using System; +using System.Collections.Concurrent; +using System.Linq; +using System.Reflection; +using System.Reflection.Emit; + +namespace NumSharp.Backends.Kernels +{ + public static partial class ILKernelGenerator + { + #region Unary Kernel Generation + + /// + /// Cache for unary kernels. + /// Key: UnaryKernelKey (InputType, OutputType, Op, IsContiguous) + /// + private static readonly ConcurrentDictionary _unaryCache = new(); + + /// + /// Number of unary kernels in cache. + /// + public static int UnaryCachedCount => _unaryCache.Count; + + /// + /// Get or generate a unary kernel for the specified key. + /// + public static UnaryKernel GetUnaryKernel(UnaryKernelKey key) + { + if (!Enabled) + throw new InvalidOperationException("IL generation is disabled"); + + return _unaryCache.GetOrAdd(key, GenerateUnaryKernel); + } + + /// + /// Try to get or generate a unary kernel. Returns null if generation fails. + /// + public static UnaryKernel? TryGetUnaryKernel(UnaryKernelKey key) + { + if (!Enabled) + return null; + + try + { + return _unaryCache.GetOrAdd(key, GenerateUnaryKernel); + } + catch + { + return null; + } + } + + /// + /// Clear the unary kernel cache. + /// + public static void ClearUnary() => _unaryCache.Clear(); + + /// + /// Generate a unary kernel for the specified key. + /// + private static UnaryKernel GenerateUnaryKernel(UnaryKernelKey key) + { + // UnaryKernel signature: + // void(void* input, void* output, int* strides, int* shape, int ndim, int totalSize) + var dm = new DynamicMethod( + name: $"Unary_{key}", + returnType: typeof(void), + parameterTypes: new[] + { + typeof(void*), typeof(void*), + typeof(int*), typeof(int*), + typeof(int), typeof(int) + }, + owner: typeof(ILKernelGenerator), + skipVisibility: true + ); + + var il = dm.GetILGenerator(); + + int inputSize = GetTypeSize(key.InputType); + int outputSize = GetTypeSize(key.OutputType); + + if (key.IsContiguous) + { + // Check if we can use SIMD for this operation + bool canSimd = CanUseUnarySimd(key); + if (canSimd) + { + EmitUnarySimdLoop(il, key, inputSize, outputSize); + } + else + { + EmitUnaryScalarLoop(il, key, inputSize, outputSize); + } + } + else + { + EmitUnaryStridedLoop(il, key, inputSize, outputSize); + } + + il.Emit(OpCodes.Ret); + return dm.CreateDelegate(); + } + + /// + /// Check if SIMD can be used for this unary operation. + /// + private static bool CanUseUnarySimd(UnaryKernelKey key) + { + // SIMD only for same-type operations on float/double + if (!key.IsSameType) + return false; + + // Only float and double have good SIMD support for unary ops + if (key.InputType != NPTypeCode.Single && key.InputType != NPTypeCode.Double) + return false; + + // Only certain operations have SIMD support + return key.Op == UnaryOp.Negate || key.Op == UnaryOp.Abs || key.Op == UnaryOp.Sqrt || + key.Op == UnaryOp.Floor || key.Op == UnaryOp.Ceil; + } + + /// + /// Emit SIMD loop for contiguous unary operations. + /// + private static void EmitUnarySimdLoop(ILGenerator il, UnaryKernelKey key, + int inputSize, int outputSize) + { + int vectorCount = GetVectorCount(key.InputType); + + var locI = il.DeclareLocal(typeof(int)); // loop counter + var locVectorEnd = il.DeclareLocal(typeof(int)); // totalSize - vectorCount + + var lblSimdLoop = il.DefineLabel(); + var lblSimdLoopEnd = il.DefineLabel(); + var lblTailLoop = il.DefineLabel(); + var lblTailLoopEnd = il.DefineLabel(); + + // vectorEnd = totalSize - vectorCount + il.Emit(OpCodes.Ldarg_S, (byte)5); // totalSize + il.Emit(OpCodes.Ldc_I4, vectorCount); + il.Emit(OpCodes.Sub); + il.Emit(OpCodes.Stloc, locVectorEnd); + + // i = 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locI); + + // === SIMD LOOP === + il.MarkLabel(lblSimdLoop); + + // if (i > vectorEnd) goto SimdLoopEnd + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldloc, locVectorEnd); + il.Emit(OpCodes.Bgt, lblSimdLoopEnd); + + // Load input vector + il.Emit(OpCodes.Ldarg_0); // input + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, inputSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitVectorLoad(il, key.InputType); + + // Vector operation + EmitUnaryVectorOperation(il, key.Op, key.InputType); + + // Store result vector + il.Emit(OpCodes.Ldarg_1); // output + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, outputSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitVectorStore(il, key.OutputType); + + // i += vectorCount + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4, vectorCount); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblSimdLoop); + il.MarkLabel(lblSimdLoopEnd); + + // === TAIL LOOP === + il.MarkLabel(lblTailLoop); + + // if (i >= totalSize) goto end + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldarg_S, (byte)5); // totalSize + il.Emit(OpCodes.Bge, lblTailLoopEnd); + + // output[i] = op(input[i]) + il.Emit(OpCodes.Ldarg_1); // output + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, outputSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + + il.Emit(OpCodes.Ldarg_0); // input + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, inputSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.InputType); + EmitConvertTo(il, key.InputType, key.OutputType); + + EmitUnaryScalarOperation(il, key.Op, key.OutputType); + EmitStoreIndirect(il, key.OutputType); + + // i++ + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblTailLoop); + il.MarkLabel(lblTailLoopEnd); + } + + /// + /// Emit scalar loop for contiguous unary operations (no SIMD). + /// + private static void EmitUnaryScalarLoop(ILGenerator il, UnaryKernelKey key, + int inputSize, int outputSize) + { + // Args: void* input (0), void* output (1), + // int* strides (2), int* shape (3), + // int ndim (4), int totalSize (5) + + var locI = il.DeclareLocal(typeof(int)); // loop counter + + var lblLoop = il.DefineLabel(); + var lblLoopEnd = il.DefineLabel(); + + // i = 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locI); + + il.MarkLabel(lblLoop); + + // if (i >= totalSize) goto end + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldarg_S, (byte)5); // totalSize + il.Emit(OpCodes.Bge, lblLoopEnd); + + // output[i] = op(input[i]) + // Load output address + il.Emit(OpCodes.Ldarg_1); // output + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, outputSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + + // Load input[i] and convert to output type + il.Emit(OpCodes.Ldarg_0); // input + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, inputSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.InputType); + EmitConvertTo(il, key.InputType, key.OutputType); + + // Perform operation + EmitUnaryScalarOperation(il, key.Op, key.OutputType); + + // Store result + EmitStoreIndirect(il, key.OutputType); + + // i++ + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblLoop); + il.MarkLabel(lblLoopEnd); + } + + /// + /// Emit strided loop for non-contiguous unary operations. + /// Uses coordinate-based iteration. + /// + private static void EmitUnaryStridedLoop(ILGenerator il, UnaryKernelKey key, + int inputSize, int outputSize) + { + // Args: void* input (0), void* output (1), + // int* strides (2), int* shape (3), + // int ndim (4), int totalSize (5) + + var locI = il.DeclareLocal(typeof(int)); // linear index + var locD = il.DeclareLocal(typeof(int)); // dimension counter + var locInputOffset = il.DeclareLocal(typeof(int)); // input offset + var locCoord = il.DeclareLocal(typeof(int)); // current coordinate + var locIdx = il.DeclareLocal(typeof(int)); // temp for coordinate calculation + + var lblLoop = il.DefineLabel(); + var lblLoopEnd = il.DefineLabel(); + var lblDimLoop = il.DefineLabel(); + var lblDimLoopEnd = il.DefineLabel(); + + // i = 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locI); + + // Main loop + il.MarkLabel(lblLoop); + + // if (i >= totalSize) goto end + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldarg_S, (byte)5); // totalSize + il.Emit(OpCodes.Bge, lblLoopEnd); + + // Calculate inputOffset from linear index + // inputOffset = 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locInputOffset); + + // idx = i (for coordinate calculation) + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Stloc, locIdx); + + // For each dimension (right to left): coord = idx % shape[d], idx /= shape[d] + // d = ndim - 1 + il.Emit(OpCodes.Ldarg_S, (byte)4); // ndim + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Sub); + il.Emit(OpCodes.Stloc, locD); + + il.MarkLabel(lblDimLoop); + + // if (d < 0) goto DimLoopEnd + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Blt, lblDimLoopEnd); + + // coord = idx % shape[d] + il.Emit(OpCodes.Ldloc, locIdx); + il.Emit(OpCodes.Ldarg_3); // shape + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4_4); // sizeof(int) + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Ldind_I4); + il.Emit(OpCodes.Rem); + il.Emit(OpCodes.Stloc, locCoord); + + // idx /= shape[d] + il.Emit(OpCodes.Ldloc, locIdx); + il.Emit(OpCodes.Ldarg_3); // shape + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4_4); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Ldind_I4); + il.Emit(OpCodes.Div); + il.Emit(OpCodes.Stloc, locIdx); + + // inputOffset += coord * strides[d] + il.Emit(OpCodes.Ldloc, locInputOffset); + il.Emit(OpCodes.Ldloc, locCoord); + il.Emit(OpCodes.Ldarg_2); // strides + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4_4); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Ldind_I4); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locInputOffset); + + // d-- + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Sub); + il.Emit(OpCodes.Stloc, locD); + + il.Emit(OpCodes.Br, lblDimLoop); + il.MarkLabel(lblDimLoopEnd); + + // Now compute: output[i] = op(input[inputOffset]) + // Load output address (contiguous output) + il.Emit(OpCodes.Ldarg_1); // output + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, outputSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + + // Load input[inputOffset] + il.Emit(OpCodes.Ldarg_0); // input + il.Emit(OpCodes.Ldloc, locInputOffset); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, inputSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.InputType); + EmitConvertTo(il, key.InputType, key.OutputType); + + // Operation + EmitUnaryScalarOperation(il, key.Op, key.OutputType); + + // Store + EmitStoreIndirect(il, key.OutputType); + + // i++ + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblLoop); + il.MarkLabel(lblLoopEnd); + } + + /// + /// Emit unary scalar operation. + /// + internal static void EmitUnaryScalarOperation(ILGenerator il, UnaryOp op, NPTypeCode type) + { + // Special handling for decimal + if (type == NPTypeCode.Decimal) + { + EmitUnaryDecimalOperation(il, op); + return; + } + + switch (op) + { + case UnaryOp.Negate: + // For unsigned types, use two's complement: ~val + 1 + // For signed types, use neg opcode + if (IsUnsigned(type)) + { + // ~val + 1 = two's complement negation + il.Emit(OpCodes.Not); + il.Emit(OpCodes.Ldc_I4_1); + // Need to widen to correct type before add + if (type == NPTypeCode.UInt64) + { + il.Emit(OpCodes.Conv_U8); + } + il.Emit(OpCodes.Add); + } + else + { + il.Emit(OpCodes.Neg); + } + break; + + case UnaryOp.Abs: + EmitMathCall(il, "Abs", type); + break; + + case UnaryOp.Sqrt: + EmitMathCall(il, "Sqrt", type); + break; + + case UnaryOp.Exp: + EmitMathCall(il, "Exp", type); + break; + + case UnaryOp.Log: + EmitMathCall(il, "Log", type); + break; + + case UnaryOp.Sin: + EmitMathCall(il, "Sin", type); + break; + + case UnaryOp.Cos: + EmitMathCall(il, "Cos", type); + break; + + case UnaryOp.Tan: + EmitMathCall(il, "Tan", type); + break; + + case UnaryOp.Sinh: + EmitMathCall(il, "Sinh", type); + break; + + case UnaryOp.Cosh: + EmitMathCall(il, "Cosh", type); + break; + + case UnaryOp.Tanh: + EmitMathCall(il, "Tanh", type); + break; + + case UnaryOp.ASin: + EmitMathCall(il, "Asin", type); + break; + + case UnaryOp.ACos: + EmitMathCall(il, "Acos", type); + break; + + case UnaryOp.ATan: + EmitMathCall(il, "Atan", type); + break; + + case UnaryOp.Exp2: + // Use Math.Pow(2, x) since Math.Exp2 may not be available + EmitExp2Call(il, type); + break; + + case UnaryOp.Expm1: + // exp(x) - 1: call Exp then subtract 1 + EmitMathCall(il, "Exp", type); + EmitSubtractOne(il, type); + break; + + case UnaryOp.Log2: + EmitMathCall(il, "Log2", type); + break; + + case UnaryOp.Log10: + EmitMathCall(il, "Log10", type); + break; + + case UnaryOp.Log1p: + // log(1 + x): add 1 then call Log + EmitAddOne(il, type); + EmitMathCall(il, "Log", type); + break; + + case UnaryOp.Sign: + EmitSignCall(il, type); + break; + + case UnaryOp.Ceil: + EmitMathCall(il, "Ceiling", type); + break; + + case UnaryOp.Floor: + EmitMathCall(il, "Floor", type); + break; + + case UnaryOp.Round: + EmitMathCall(il, "Round", type); + break; + + default: + throw new NotSupportedException($"Unary operation {op} not supported"); + } + } + + /// + /// Emit call to Math.X method with appropriate overload. + /// + private static void EmitMathCall(ILGenerator il, string methodName, NPTypeCode type) + { + MethodInfo? method; + + if (type == NPTypeCode.Single) + { + // Use MathF for float + method = typeof(MathF).GetMethod(methodName, new[] { typeof(float) }); + } + else if (type == NPTypeCode.Double) + { + // Use Math for double + method = typeof(Math).GetMethod(methodName, new[] { typeof(double) }); + } + else + { + // For integer types, convert to double, call Math, convert back + // Stack has: value (as output type) + // Need to: conv to double, call Math.X, conv back + + // Convert to double first + EmitConvertToDouble(il, type); + + // Call Math.X(double) + method = typeof(Math).GetMethod(methodName, new[] { typeof(double) }); + il.EmitCall(OpCodes.Call, method!, null); + + // Convert back to target type + EmitConvertFromDouble(il, type); + return; + } + + il.EmitCall(OpCodes.Call, method!, null); + } + + /// + /// Convert stack value to double. + /// + private static void EmitConvertToDouble(ILGenerator il, NPTypeCode from) + { + if (from == NPTypeCode.Double) + return; + + if (IsUnsigned(from)) + il.Emit(OpCodes.Conv_R_Un); + il.Emit(OpCodes.Conv_R8); + } + + /// + /// Convert double on stack to target type. + /// + private static void EmitConvertFromDouble(ILGenerator il, NPTypeCode to) + { + if (to == NPTypeCode.Double) + return; + + switch (to) + { + case NPTypeCode.Boolean: + il.Emit(OpCodes.Ldc_R8, 0.0); + il.Emit(OpCodes.Cgt_Un); + break; + case NPTypeCode.Byte: + il.Emit(OpCodes.Conv_U1); + break; + case NPTypeCode.Int16: + il.Emit(OpCodes.Conv_I2); + break; + case NPTypeCode.UInt16: + case NPTypeCode.Char: + il.Emit(OpCodes.Conv_U2); + break; + case NPTypeCode.Int32: + il.Emit(OpCodes.Conv_I4); + break; + case NPTypeCode.UInt32: + il.Emit(OpCodes.Conv_U4); + break; + case NPTypeCode.Int64: + il.Emit(OpCodes.Conv_I8); + break; + case NPTypeCode.UInt64: + il.Emit(OpCodes.Conv_U8); + break; + case NPTypeCode.Single: + il.Emit(OpCodes.Conv_R4); + break; + default: + throw new NotSupportedException($"Conversion to {to} not supported"); + } + } + + /// + /// Emit 2^x calculation using Math.Pow(2, x). + /// + private static void EmitExp2Call(ILGenerator il, NPTypeCode type) + { + if (type == NPTypeCode.Single) + { + // For float: convert to double, call Pow, convert back + il.Emit(OpCodes.Conv_R8); + il.Emit(OpCodes.Ldc_R8, 2.0); + // Stack: [exponent, base] - but Pow expects (base, exponent) + // Need to swap them + var locExp = il.DeclareLocal(typeof(double)); + il.Emit(OpCodes.Stloc, locExp); // Save exponent + // Now push base then exponent + il.Emit(OpCodes.Ldc_R8, 2.0); + il.Emit(OpCodes.Ldloc, locExp); + il.EmitCall(OpCodes.Call, typeof(Math).GetMethod("Pow", new[] { typeof(double), typeof(double) })!, null); + il.Emit(OpCodes.Conv_R4); + } + else if (type == NPTypeCode.Double) + { + // For double: just call Pow + var locExp = il.DeclareLocal(typeof(double)); + il.Emit(OpCodes.Stloc, locExp); // Save exponent + il.Emit(OpCodes.Ldc_R8, 2.0); + il.Emit(OpCodes.Ldloc, locExp); + il.EmitCall(OpCodes.Call, typeof(Math).GetMethod("Pow", new[] { typeof(double), typeof(double) })!, null); + } + else + { + // For integer types: convert to double, call Pow, convert back + EmitConvertToDouble(il, type); + var locExp = il.DeclareLocal(typeof(double)); + il.Emit(OpCodes.Stloc, locExp); // Save exponent + il.Emit(OpCodes.Ldc_R8, 2.0); + il.Emit(OpCodes.Ldloc, locExp); + il.EmitCall(OpCodes.Call, typeof(Math).GetMethod("Pow", new[] { typeof(double), typeof(double) })!, null); + EmitConvertFromDouble(il, type); + } + } + + /// + /// Emit subtraction of 1 from the value on stack. + /// Used for expm1 = exp(x) - 1. + /// + private static void EmitSubtractOne(ILGenerator il, NPTypeCode type) + { + switch (type) + { + case NPTypeCode.Single: + il.Emit(OpCodes.Ldc_R4, 1.0f); + il.Emit(OpCodes.Sub); + break; + case NPTypeCode.Double: + il.Emit(OpCodes.Ldc_R8, 1.0); + il.Emit(OpCodes.Sub); + break; + default: + // For integer types, value is already double from math call + il.Emit(OpCodes.Ldc_R8, 1.0); + il.Emit(OpCodes.Sub); + break; + } + } + + /// + /// Emit addition of 1 to the value on stack. + /// Used for log1p = log(1 + x). + /// + private static void EmitAddOne(ILGenerator il, NPTypeCode type) + { + // Convert to appropriate float type first, then add 1 + if (type == NPTypeCode.Single) + { + il.Emit(OpCodes.Ldc_R4, 1.0f); + il.Emit(OpCodes.Add); + } + else if (type == NPTypeCode.Double) + { + il.Emit(OpCodes.Ldc_R8, 1.0); + il.Emit(OpCodes.Add); + } + else + { + // For integer types, convert to double first, then add 1 + // The conversion to double will happen in EmitMathCall + EmitConvertToDouble(il, type); + il.Emit(OpCodes.Ldc_R8, 1.0); + il.Emit(OpCodes.Add); + } + } + + /// + /// Emit Math.Sign call with proper type conversion. + /// Math.Sign returns int, so we need to convert back to target type. + /// NumPy: sign(NaN) returns NaN, but .NET Math.Sign throws ArithmeticException. + /// We check for NaN first and return it directly. + /// + private static void EmitSignCall(ILGenerator il, NPTypeCode type) + { + if (type == NPTypeCode.Single) + { + // NumPy: sign(NaN) = NaN. .NET MathF.Sign(NaN) throws. + // Check for NaN first: if (float.IsNaN(x)) return x; else return MathF.Sign(x); + var lblNotNaN = il.DefineLabel(); + var lblEnd = il.DefineLabel(); + + il.Emit(OpCodes.Dup); // duplicate for NaN check + il.EmitCall(OpCodes.Call, typeof(float).GetMethod("IsNaN", new[] { typeof(float) })!, null); + il.Emit(OpCodes.Brfalse, lblNotNaN); + + // Is NaN - value is already on stack, jump to end + il.Emit(OpCodes.Br, lblEnd); + + il.MarkLabel(lblNotNaN); + // Not NaN - call MathF.Sign + var method = typeof(MathF).GetMethod("Sign", new[] { typeof(float) }); + il.EmitCall(OpCodes.Call, method!, null); + il.Emit(OpCodes.Conv_R4); + + il.MarkLabel(lblEnd); + } + else if (type == NPTypeCode.Double) + { + // NumPy: sign(NaN) = NaN. .NET Math.Sign(NaN) throws. + // Check for NaN first: if (double.IsNaN(x)) return x; else return Math.Sign(x); + var lblNotNaN = il.DefineLabel(); + var lblEnd = il.DefineLabel(); + + il.Emit(OpCodes.Dup); // duplicate for NaN check + il.EmitCall(OpCodes.Call, typeof(double).GetMethod("IsNaN", new[] { typeof(double) })!, null); + il.Emit(OpCodes.Brfalse, lblNotNaN); + + // Is NaN - value is already on stack, jump to end + il.Emit(OpCodes.Br, lblEnd); + + il.MarkLabel(lblNotNaN); + // Not NaN - call Math.Sign + var method = typeof(Math).GetMethod("Sign", new[] { typeof(double) }); + il.EmitCall(OpCodes.Call, method!, null); + il.Emit(OpCodes.Conv_R8); + + il.MarkLabel(lblEnd); + } + else if (type == NPTypeCode.Decimal) + { + // Decimal has its own Sign method that returns int + var method = typeof(Math).GetMethod("Sign", new[] { typeof(decimal) }); + il.EmitCall(OpCodes.Call, method!, null); + // Convert int to decimal + il.EmitCall(OpCodes.Call, typeof(decimal).GetMethod("op_Implicit", new[] { typeof(int) })!, null); + } + else + { + // For integer types: convert to double, call Math.Sign, convert back + EmitConvertToDouble(il, type); + var method = typeof(Math).GetMethod("Sign", new[] { typeof(double) }); + il.EmitCall(OpCodes.Call, method!, null); + // Convert int result back to target type + EmitConvertFromInt(il, type); + } + } + + /// + /// Convert int on stack to target type. + /// + private static void EmitConvertFromInt(ILGenerator il, NPTypeCode to) + { + switch (to) + { + case NPTypeCode.Boolean: + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Cgt_Un); + break; + case NPTypeCode.Byte: + il.Emit(OpCodes.Conv_U1); + break; + case NPTypeCode.Int16: + il.Emit(OpCodes.Conv_I2); + break; + case NPTypeCode.UInt16: + case NPTypeCode.Char: + il.Emit(OpCodes.Conv_U2); + break; + case NPTypeCode.Int32: + // Already int, no conversion needed + break; + case NPTypeCode.UInt32: + il.Emit(OpCodes.Conv_U4); + break; + case NPTypeCode.Int64: + il.Emit(OpCodes.Conv_I8); + break; + case NPTypeCode.UInt64: + il.Emit(OpCodes.Conv_U8); + break; + case NPTypeCode.Single: + il.Emit(OpCodes.Conv_R4); + break; + case NPTypeCode.Double: + il.Emit(OpCodes.Conv_R8); + break; + default: + throw new NotSupportedException($"Conversion from int to {to} not supported"); + } + } + + /// + /// Emit unary operation for decimal type. + /// + private static void EmitUnaryDecimalOperation(ILGenerator il, UnaryOp op) + { + switch (op) + { + case UnaryOp.Negate: + il.EmitCall(OpCodes.Call, + typeof(decimal).GetMethod("op_UnaryNegation", new[] { typeof(decimal) })!, + null); + break; + + case UnaryOp.Abs: + il.EmitCall(OpCodes.Call, + typeof(Math).GetMethod("Abs", new[] { typeof(decimal) })!, + null); + break; + + case UnaryOp.Sign: + // Math.Sign(decimal) returns int, convert back to decimal + il.EmitCall(OpCodes.Call, + typeof(Math).GetMethod("Sign", new[] { typeof(decimal) })!, + null); + il.EmitCall(OpCodes.Call, + typeof(decimal).GetMethod("op_Implicit", new[] { typeof(int) })!, + null); + break; + + case UnaryOp.Ceil: + // Math.Ceiling has decimal overload + il.EmitCall(OpCodes.Call, + typeof(Math).GetMethod("Ceiling", new[] { typeof(decimal) })!, + null); + break; + + case UnaryOp.Floor: + // Math.Floor has decimal overload + il.EmitCall(OpCodes.Call, + typeof(Math).GetMethod("Floor", new[] { typeof(decimal) })!, + null); + break; + + case UnaryOp.Round: + // Math.Round has decimal overload + il.EmitCall(OpCodes.Call, + typeof(Math).GetMethod("Round", new[] { typeof(decimal) })!, + null); + break; + + case UnaryOp.Sqrt: + case UnaryOp.Exp: + case UnaryOp.Log: + case UnaryOp.Sin: + case UnaryOp.Cos: + case UnaryOp.Tan: + case UnaryOp.Sinh: + case UnaryOp.Cosh: + case UnaryOp.Tanh: + case UnaryOp.ASin: + case UnaryOp.ACos: + case UnaryOp.ATan: + case UnaryOp.Log2: + case UnaryOp.Log10: + // Convert to double, perform operation, convert back + il.EmitCall(OpCodes.Call, + typeof(decimal).GetMethod("ToDouble", new[] { typeof(decimal) })!, + null); + + string mathMethod = op switch + { + UnaryOp.Sqrt => "Sqrt", + UnaryOp.Exp => "Exp", + UnaryOp.Log => "Log", + UnaryOp.Sin => "Sin", + UnaryOp.Cos => "Cos", + UnaryOp.Tan => "Tan", + UnaryOp.Sinh => "Sinh", + UnaryOp.Cosh => "Cosh", + UnaryOp.Tanh => "Tanh", + UnaryOp.ASin => "Asin", + UnaryOp.ACos => "Acos", + UnaryOp.ATan => "Atan", + UnaryOp.Log2 => "Log2", + UnaryOp.Log10 => "Log10", + _ => throw new NotSupportedException() + }; + + il.EmitCall(OpCodes.Call, + typeof(Math).GetMethod(mathMethod, new[] { typeof(double) })!, + null); + + il.EmitCall(OpCodes.Call, + typeof(decimal).GetMethod("op_Explicit", new[] { typeof(double) })!, + null); + break; + + case UnaryOp.Exp2: + // 2^x for decimal: convert to double, use Math.Pow, convert back + il.EmitCall(OpCodes.Call, + typeof(decimal).GetMethod("ToDouble", new[] { typeof(decimal) })!, + null); + // Stack: [exponent (double)] - need to call Pow(2, exponent) + var locExpDec = il.DeclareLocal(typeof(double)); + il.Emit(OpCodes.Stloc, locExpDec); + il.Emit(OpCodes.Ldc_R8, 2.0); + il.Emit(OpCodes.Ldloc, locExpDec); + il.EmitCall(OpCodes.Call, + typeof(Math).GetMethod("Pow", new[] { typeof(double), typeof(double) })!, + null); + il.EmitCall(OpCodes.Call, + typeof(decimal).GetMethod("op_Explicit", new[] { typeof(double) })!, + null); + break; + + case UnaryOp.Expm1: + // exp(x) - 1 for decimal + il.EmitCall(OpCodes.Call, + typeof(decimal).GetMethod("ToDouble", new[] { typeof(decimal) })!, + null); + il.EmitCall(OpCodes.Call, + typeof(Math).GetMethod("Exp", new[] { typeof(double) })!, + null); + il.Emit(OpCodes.Ldc_R8, 1.0); + il.Emit(OpCodes.Sub); + il.EmitCall(OpCodes.Call, + typeof(decimal).GetMethod("op_Explicit", new[] { typeof(double) })!, + null); + break; + + case UnaryOp.Log1p: + // log(1 + x) for decimal + il.EmitCall(OpCodes.Call, + typeof(decimal).GetMethod("ToDouble", new[] { typeof(decimal) })!, + null); + il.Emit(OpCodes.Ldc_R8, 1.0); + il.Emit(OpCodes.Add); + il.EmitCall(OpCodes.Call, + typeof(Math).GetMethod("Log", new[] { typeof(double) })!, + null); + il.EmitCall(OpCodes.Call, + typeof(decimal).GetMethod("op_Explicit", new[] { typeof(double) })!, + null); + break; + + default: + throw new NotSupportedException($"Unary operation {op} not supported for decimal"); + } + } + + /// + /// Emit Vector unary operation (adapts to V128/V256/V512). + /// + private static void EmitUnaryVectorOperation(ILGenerator il, UnaryOp op, NPTypeCode type) + { + var containerType = GetVectorContainerType(); + var clrType = GetClrType(type); + var vectorType = GetVectorType(clrType); + + string methodName = op switch + { + UnaryOp.Negate => "op_UnaryNegation", + UnaryOp.Abs => "Abs", + UnaryOp.Sqrt => "Sqrt", + UnaryOp.Floor => "Floor", + UnaryOp.Ceil => "Ceiling", // Vector uses "Ceiling" not "Ceil" + _ => throw new NotSupportedException($"SIMD operation {op} not supported") + }; + + MethodInfo? method; + + if (op == UnaryOp.Negate) + { + // Negation is an operator on Vector + method = vectorType.GetMethod(methodName, BindingFlags.Public | BindingFlags.Static, + null, new[] { vectorType }, null); + } + else if (op == UnaryOp.Floor || op == UnaryOp.Ceil) + { + // Floor/Ceiling are NOT generic - they're overloaded for specific types + method = containerType.GetMethod(methodName, BindingFlags.Public | BindingFlags.Static, + null, new[] { vectorType }, null); + } + else + { + // Abs, Sqrt are generic static methods on Vector container + method = containerType.GetMethods(BindingFlags.Public | BindingFlags.Static) + .Where(m => m.Name == methodName && m.IsGenericMethod && m.GetParameters().Length == 1) + .Select(m => m.MakeGenericMethod(clrType)) + .FirstOrDefault(m => m.GetParameters()[0].ParameterType == vectorType); + } + + if (method == null) + throw new InvalidOperationException($"Could not find {methodName} for {vectorType.Name}"); + + il.EmitCall(OpCodes.Call, method, null); + } + + #endregion + + #region Scalar Kernel Generation + + /// + /// Cache for unary scalar kernels. + /// Key: UnaryScalarKernelKey (InputType, OutputType, Op) + /// Value: Delegate (Func<TInput, TOutput>) + /// + private static readonly ConcurrentDictionary _unaryScalarCache = new(); + + /// + /// Cache for binary scalar kernels. + /// Key: BinaryScalarKernelKey (LhsType, RhsType, ResultType, Op) + /// Value: Delegate (Func<TLhs, TRhs, TResult>) + /// + private static readonly ConcurrentDictionary _binaryScalarCache = new(); + + /// + /// Number of unary scalar kernels in cache. + /// + public static int UnaryScalarCachedCount => _unaryScalarCache.Count; + + /// + /// Number of binary scalar kernels in cache. + /// + public static int BinaryScalarCachedCount => _binaryScalarCache.Count; + + /// + /// Clear the scalar kernel caches. + /// + public static void ClearScalar() + { + _unaryScalarCache.Clear(); + _binaryScalarCache.Clear(); + } + + /// + /// Get or generate an IL-based unary scalar delegate. + /// Returns a Func<TInput, TOutput> delegate. + /// + public static Delegate GetUnaryScalarDelegate(UnaryScalarKernelKey key) + { + if (!Enabled) + throw new InvalidOperationException("IL generation is disabled"); + + return _unaryScalarCache.GetOrAdd(key, GenerateUnaryScalarDelegate); + } + + /// + /// Get or generate an IL-based binary scalar delegate. + /// Returns a Func<TLhs, TRhs, TResult> delegate. + /// + public static Delegate GetBinaryScalarDelegate(BinaryScalarKernelKey key) + { + if (!Enabled) + throw new InvalidOperationException("IL generation is disabled"); + + return _binaryScalarCache.GetOrAdd(key, GenerateBinaryScalarDelegate); + } + + /// + /// Generate an IL-based unary scalar delegate. + /// Creates a Func<TInput, TOutput> that performs the operation. + /// + private static Delegate GenerateUnaryScalarDelegate(UnaryScalarKernelKey key) + { + var inputClr = GetClrType(key.InputType); + var outputClr = GetClrType(key.OutputType); + + // Create DynamicMethod: TOutput Method(TInput input) + var dm = new DynamicMethod( + name: $"ScalarUnary_{key}", + returnType: outputClr, + parameterTypes: new[] { inputClr }, + owner: typeof(ILKernelGenerator), + skipVisibility: true + ); + + var il = dm.GetILGenerator(); + + // Load input argument + il.Emit(OpCodes.Ldarg_0); + + // Convert to output type if different + EmitConvertTo(il, key.InputType, key.OutputType); + + // Perform the unary operation (result is on stack) + EmitUnaryScalarOperation(il, key.Op, key.OutputType); + + // Return + il.Emit(OpCodes.Ret); + + // Create typed Func + var funcType = typeof(Func<,>).MakeGenericType(inputClr, outputClr); + return dm.CreateDelegate(funcType); + } + + /// + /// Generate an IL-based binary scalar delegate. + /// Creates a Func<TLhs, TRhs, TResult> that performs the operation. + /// + private static Delegate GenerateBinaryScalarDelegate(BinaryScalarKernelKey key) + { + var lhsClr = GetClrType(key.LhsType); + var rhsClr = GetClrType(key.RhsType); + var resultClr = GetClrType(key.ResultType); + + // Create DynamicMethod: TResult Method(TLhs lhs, TRhs rhs) + var dm = new DynamicMethod( + name: $"ScalarBinary_{key}", + returnType: resultClr, + parameterTypes: new[] { lhsClr, rhsClr }, + owner: typeof(ILKernelGenerator), + skipVisibility: true + ); + + var il = dm.GetILGenerator(); + + // Load lhs, convert to result type + il.Emit(OpCodes.Ldarg_0); + EmitConvertTo(il, key.LhsType, key.ResultType); + + // Load rhs, convert to result type + il.Emit(OpCodes.Ldarg_1); + EmitConvertTo(il, key.RhsType, key.ResultType); + + // Perform binary operation + EmitScalarOperation(il, key.Op, key.ResultType); + + // Return + il.Emit(OpCodes.Ret); + + // Create typed Func + var funcType = typeof(Func<,,>).MakeGenericType(lhsClr, rhsClr, resultClr); + return dm.CreateDelegate(funcType); + } + + #endregion + } +} diff --git a/src/NumSharp.Core/Backends/Kernels/ILKernelGenerator.cs b/src/NumSharp.Core/Backends/Kernels/ILKernelGenerator.cs index 453c4c35..f4018d4b 100644 --- a/src/NumSharp.Core/Backends/Kernels/ILKernelGenerator.cs +++ b/src/NumSharp.Core/Backends/Kernels/ILKernelGenerator.cs @@ -1,9 +1,7 @@ using System; -using System.Collections.Concurrent; using System.Linq; using System.Reflection; using System.Reflection.Emit; -using System.Runtime.CompilerServices; using System.Runtime.Intrinsics; namespace NumSharp.Backends.Kernels @@ -16,4808 +14,494 @@ namespace NumSharp.Backends.Kernels /// Currently implements the SimdFull execution path (both operands contiguous). /// Falls back to C# implementations for other paths. /// - public static class ILKernelGenerator + public static partial class ILKernelGenerator { /// - /// Cache of IL-generated contiguous kernels. - /// Key: (Operation, Type) - /// - private static readonly ConcurrentDictionary<(BinaryOp, Type), Delegate> _contiguousKernelCache = new(); - - /// - /// Whether IL generation is enabled. Can be disabled for debugging. - /// - public static bool Enabled { get; set; } = true; - - /// - /// Detected vector width at startup: 512, 256, 128, or 0 (no SIMD). - /// - public static readonly int VectorBits = - Vector512.IsHardwareAccelerated ? 512 : - Vector256.IsHardwareAccelerated ? 256 : - Vector128.IsHardwareAccelerated ? 128 : 0; - - /// - /// Number of bytes per vector register. - /// - public static readonly int VectorBytes = VectorBits / 8; - - /// - /// Number of IL-generated kernels in cache. - /// - public static int CachedCount => _contiguousKernelCache.Count; - - /// - /// Clear the IL kernel cache. - /// - public static void Clear() => _contiguousKernelCache.Clear(); - - /// - /// Get the Vector container type (Vector128, Vector256, or Vector512). - /// - private static Type GetVectorContainerType() => VectorBits switch - { - 512 => typeof(Vector512), - 256 => typeof(Vector256), - 128 => typeof(Vector128), - _ => throw new NotSupportedException("No SIMD support") - }; - - /// - /// Get the Vector{Width}<T> generic type. - /// - private static Type GetVectorType(Type elementType) => VectorBits switch - { - 512 => typeof(Vector512<>).MakeGenericType(elementType), - 256 => typeof(Vector256<>).MakeGenericType(elementType), - 128 => typeof(Vector128<>).MakeGenericType(elementType), - _ => throw new NotSupportedException("No SIMD support") - }; - - #region Public API - - /// - /// Get or generate an IL-based kernel for contiguous (SimdFull) operations. - /// Returns null if IL generation is not supported for this type/operation. - /// - public static ContiguousKernel? GetContiguousKernel(BinaryOp op) where T : unmanaged - { - if (!Enabled) - return null; - - var key = (op, typeof(T)); - - // Check cache first - if (_contiguousKernelCache.TryGetValue(key, out var cached)) - return (ContiguousKernel)cached; - - // Generate new kernel - var kernel = TryGenerateContiguousKernel(op); - if (kernel == null) - return null; - - // Try to add to cache; if another thread added first, use theirs - if (_contiguousKernelCache.TryAdd(key, kernel)) - return kernel; - - // Another thread beat us - return the cached version - return (ContiguousKernel)_contiguousKernelCache[key]; - } - - /// - /// Generate a full unified kernel that handles all execution paths. - /// Uses IL-generated code for hot paths, falls back to C# for others. - /// - public static BinaryKernel? GenerateUnifiedKernel(BinaryOp op) where T : unmanaged - { - if (!Enabled) - return null; - - // Get the IL-generated contiguous kernel - var contiguousKernel = GetContiguousKernel(op); - if (contiguousKernel == null) - return null; - - // Create a wrapper that dispatches based on strides - return CreateDispatchingKernel(op, contiguousKernel); - } - - #endregion - - #region Contiguous Kernel Generation - - /// - /// Delegate for contiguous (SimdFull) operations. - /// Simplified signature - no strides needed since both arrays are contiguous. - /// - public unsafe delegate void ContiguousKernel(T* lhs, T* rhs, T* result, int count) where T : unmanaged; - - /// - /// Try to generate an IL-based contiguous kernel for the given operation and type. - /// - private static ContiguousKernel? TryGenerateContiguousKernel(BinaryOp op) where T : unmanaged - { - // Only support types with Vector256 support - if (!IsSimdSupported()) - return null; - - // Only support basic arithmetic operations - if (op != BinaryOp.Add && op != BinaryOp.Subtract && - op != BinaryOp.Multiply && op != BinaryOp.Divide) - return null; - - try - { - return GenerateContiguousKernelIL(op); - } - catch - { - // IL generation failed - fall back to C# - return null; - } - } - - /// - /// Generate IL for a contiguous SIMD kernel. - /// - private static unsafe ContiguousKernel GenerateContiguousKernelIL(BinaryOp op) where T : unmanaged - { - var dm = new DynamicMethod( - name: $"IL_Contiguous_{op}_{typeof(T).Name}", - returnType: typeof(void), - parameterTypes: new[] { typeof(T*), typeof(T*), typeof(T*), typeof(int) }, - owner: typeof(ILKernelGenerator), - skipVisibility: true - ); - - var il = dm.GetILGenerator(); - - // Declare locals - var locI = il.DeclareLocal(typeof(int)); // loop counter - var locVectorEnd = il.DeclareLocal(typeof(int)); // totalSize - vectorCount - - // Define labels - var lblSimdLoop = il.DefineLabel(); - var lblSimdLoopEnd = il.DefineLabel(); - var lblTailLoop = il.DefineLabel(); - var lblTailLoopEnd = il.DefineLabel(); - - int vectorCount = GetVectorCount(); - int elementSize = Unsafe.SizeOf(); - - // vectorEnd = count - vectorCount - il.Emit(OpCodes.Ldarg_3); // count - il.Emit(OpCodes.Ldc_I4, vectorCount); - il.Emit(OpCodes.Sub); - il.Emit(OpCodes.Stloc, locVectorEnd); - - // i = 0 - il.Emit(OpCodes.Ldc_I4_0); - il.Emit(OpCodes.Stloc, locI); - - // ========== SIMD LOOP ========== - il.MarkLabel(lblSimdLoop); - - // if (i > vectorEnd) goto SimdLoopEnd - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Ldloc, locVectorEnd); - il.Emit(OpCodes.Bgt, lblSimdLoopEnd); - - // Load lhs vector: Vector256.Load(lhs + i) - il.Emit(OpCodes.Ldarg_0); // lhs - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4, elementSize); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - EmitVectorLoad(il); - - // Load rhs vector: Vector256.Load(rhs + i) - il.Emit(OpCodes.Ldarg_1); // rhs - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4, elementSize); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - EmitVectorLoad(il); - - // Perform vector operation - EmitVectorOperation(il, op); - - // Store result: Vector256.Store(result, result + i) - il.Emit(OpCodes.Ldarg_2); // result - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4, elementSize); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - EmitVectorStore(il); - - // i += vectorCount - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Ldc_I4, vectorCount); - il.Emit(OpCodes.Add); - il.Emit(OpCodes.Stloc, locI); - - il.Emit(OpCodes.Br, lblSimdLoop); - il.MarkLabel(lblSimdLoopEnd); - - // ========== TAIL LOOP ========== - il.MarkLabel(lblTailLoop); - - // if (i >= count) goto TailLoopEnd - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Ldarg_3); // count - il.Emit(OpCodes.Bge, lblTailLoopEnd); - - // result[i] = lhs[i] op rhs[i] - // Address: result + i * elementSize - il.Emit(OpCodes.Ldarg_2); // result - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4, elementSize); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - - // Load lhs[i] - il.Emit(OpCodes.Ldarg_0); // lhs - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4, elementSize); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - EmitLoadIndirect(il); - - // Load rhs[i] - il.Emit(OpCodes.Ldarg_1); // rhs - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4, elementSize); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - EmitLoadIndirect(il); - - // Perform scalar operation - EmitScalarOperation(il, op); - - // Store to result[i] - EmitStoreIndirect(il); - - // i++ - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Ldc_I4_1); - il.Emit(OpCodes.Add); - il.Emit(OpCodes.Stloc, locI); - - il.Emit(OpCodes.Br, lblTailLoop); - il.MarkLabel(lblTailLoopEnd); - - il.Emit(OpCodes.Ret); - - return dm.CreateDelegate>(); - } - - #endregion - - #region Unified Kernel with Dispatch - - /// - /// Create a unified kernel that dispatches to IL-generated code for contiguous arrays. - /// - private static unsafe BinaryKernel CreateDispatchingKernel(BinaryOp op, ContiguousKernel contiguousKernel) - where T : unmanaged - { - // Get the C# fallback kernel method - var csharpKernel = GetCSharpKernel(op); - - return (T* lhs, T* rhs, T* result, int* lhsStrides, int* rhsStrides, int* shape, int ndim, int totalSize) => - { - var path = StrideDetector.Classify(lhsStrides, rhsStrides, shape, ndim); - - if (path == ExecutionPath.SimdFull) - { - // Use IL-generated kernel for contiguous arrays - contiguousKernel(lhs, rhs, result, totalSize); - } - else - { - // Fall back to C# implementation for other paths - csharpKernel(lhs, rhs, result, lhsStrides, rhsStrides, shape, ndim, totalSize); - } - }; - } - - /// - /// Get the C# reference implementation for fallback. - /// - private static unsafe BinaryKernel GetCSharpKernel(BinaryOp op) where T : unmanaged - { - // Return the appropriate C# kernel based on type and operation - if (op == BinaryOp.Add) - { - if (typeof(T) == typeof(int)) - return (BinaryKernel)(Delegate)(BinaryKernel)SimdKernels.Add_Int32; - if (typeof(T) == typeof(long)) - return (BinaryKernel)(Delegate)(BinaryKernel)SimdKernels.Add_Int64; - if (typeof(T) == typeof(float)) - return (BinaryKernel)(Delegate)(BinaryKernel)SimdKernels.Add_Single; - if (typeof(T) == typeof(double)) - return (BinaryKernel)(Delegate)(BinaryKernel)SimdKernels.Add_Double; - } - - throw new NotSupportedException($"C# kernel not available for {op} on {typeof(T).Name}"); - } - - #endregion - - #region IL Emission Helpers - - private static bool IsSimdSupported() where T : unmanaged - { - return typeof(T) == typeof(int) || - typeof(T) == typeof(long) || - typeof(T) == typeof(float) || - typeof(T) == typeof(double) || - typeof(T) == typeof(byte) || - typeof(T) == typeof(short) || - typeof(T) == typeof(uint) || - typeof(T) == typeof(ulong) || - typeof(T) == typeof(ushort); - } - - private static int GetVectorCount() where T : unmanaged - { - return VectorBits switch - { - 512 => Vector512.Count, - 256 => Vector256.Count, - 128 => Vector128.Count, - _ => 1 - }; - } - - private static void EmitVectorLoad(ILGenerator il) where T : unmanaged - { - var containerType = GetVectorContainerType(); - - var loadMethod = containerType - .GetMethods(BindingFlags.Public | BindingFlags.Static) - .First(m => m.Name == "Load" && m.IsGenericMethod && - m.GetParameters().Length == 1 && - m.GetParameters()[0].ParameterType.IsPointer) - .MakeGenericMethod(typeof(T)); - - il.EmitCall(OpCodes.Call, loadMethod, null); - } - - private static void EmitVectorStore(ILGenerator il) where T : unmanaged - { - var containerType = GetVectorContainerType(); - var vectorType = GetVectorType(typeof(T)); - - var storeMethod = containerType - .GetMethods(BindingFlags.Public | BindingFlags.Static) - .First(m => m.Name == "Store" && m.IsGenericMethod && - m.GetParameters().Length == 2 && - m.GetParameters()[0].ParameterType.IsGenericType) - .MakeGenericMethod(typeof(T)); - - il.EmitCall(OpCodes.Call, storeMethod, null); - } - - private static void EmitVectorOperation(ILGenerator il, BinaryOp op) where T : unmanaged - { - var vectorType = GetVectorType(typeof(T)); - - string methodName = op switch - { - BinaryOp.Add => "op_Addition", - BinaryOp.Subtract => "op_Subtraction", - BinaryOp.Multiply => "op_Multiply", - BinaryOp.Divide => "op_Division", - _ => throw new NotSupportedException($"Operation {op} not supported for SIMD") - }; - - var opMethod = vectorType.GetMethod(methodName, - BindingFlags.Public | BindingFlags.Static, - null, new[] { vectorType, vectorType }, null); - - if (opMethod == null) - throw new InvalidOperationException($"Could not find {methodName} for {vectorType.Name}"); - - il.EmitCall(OpCodes.Call, opMethod, null); - } - - private static void EmitScalarOperation(ILGenerator il, BinaryOp op) where T : unmanaged - { - // For scalar operations, use IL opcodes - // Stack has two T values - var opcode = op switch - { - BinaryOp.Add => OpCodes.Add, - BinaryOp.Subtract => OpCodes.Sub, - BinaryOp.Multiply => OpCodes.Mul, - BinaryOp.Divide => GetDivOpcode(), - _ => throw new NotSupportedException($"Operation {op} not supported") - }; - - il.Emit(opcode); - } - - private static OpCode GetDivOpcode() where T : unmanaged - { - // Use Div_Un for unsigned types - if (typeof(T) == typeof(byte) || typeof(T) == typeof(ushort) || - typeof(T) == typeof(uint) || typeof(T) == typeof(ulong)) - { - return OpCodes.Div_Un; - } - return OpCodes.Div; - } - - private static void EmitLoadIndirect(ILGenerator il) where T : unmanaged - { - // Emit the appropriate ldind instruction based on type - if (typeof(T) == typeof(byte)) il.Emit(OpCodes.Ldind_U1); - else if (typeof(T) == typeof(sbyte)) il.Emit(OpCodes.Ldind_I1); - else if (typeof(T) == typeof(short)) il.Emit(OpCodes.Ldind_I2); - else if (typeof(T) == typeof(ushort)) il.Emit(OpCodes.Ldind_U2); - else if (typeof(T) == typeof(int)) il.Emit(OpCodes.Ldind_I4); - else if (typeof(T) == typeof(uint)) il.Emit(OpCodes.Ldind_U4); - else if (typeof(T) == typeof(long)) il.Emit(OpCodes.Ldind_I8); - else if (typeof(T) == typeof(ulong)) il.Emit(OpCodes.Ldind_I8); // Same as long - else if (typeof(T) == typeof(float)) il.Emit(OpCodes.Ldind_R4); - else if (typeof(T) == typeof(double)) il.Emit(OpCodes.Ldind_R8); - else throw new NotSupportedException($"Type {typeof(T)} not supported for ldind"); - } - - private static void EmitStoreIndirect(ILGenerator il) where T : unmanaged - { - // Emit the appropriate stind instruction based on type - if (typeof(T) == typeof(byte) || typeof(T) == typeof(sbyte)) il.Emit(OpCodes.Stind_I1); - else if (typeof(T) == typeof(short) || typeof(T) == typeof(ushort)) il.Emit(OpCodes.Stind_I2); - else if (typeof(T) == typeof(int) || typeof(T) == typeof(uint)) il.Emit(OpCodes.Stind_I4); - else if (typeof(T) == typeof(long) || typeof(T) == typeof(ulong)) il.Emit(OpCodes.Stind_I8); - else if (typeof(T) == typeof(float)) il.Emit(OpCodes.Stind_R4); - else if (typeof(T) == typeof(double)) il.Emit(OpCodes.Stind_R8); - else throw new NotSupportedException($"Type {typeof(T)} not supported for stind"); - } - - #endregion - - #region Mixed-Type Kernel Generation - - /// - /// Cache for mixed-type kernels. - /// Key: MixedTypeKernelKey (LhsType, RhsType, ResultType, Op, Path) - /// - private static readonly ConcurrentDictionary _mixedTypeCache = new(); - - /// - /// Number of mixed-type kernels in cache. - /// - public static int MixedTypeCachedCount => _mixedTypeCache.Count; - - /// - /// Clear both kernel caches. - /// - public static void ClearAll() - { - _contiguousKernelCache.Clear(); - _mixedTypeCache.Clear(); - } - - /// - /// Get or generate a mixed-type kernel for the specified key. - /// - public static MixedTypeKernel GetMixedTypeKernel(MixedTypeKernelKey key) - { - if (!Enabled) - throw new InvalidOperationException("IL generation is disabled"); - - return _mixedTypeCache.GetOrAdd(key, GenerateMixedTypeKernel); - } - - /// - /// Try to get or generate a mixed-type kernel. Returns null if generation fails. - /// - public static MixedTypeKernel? TryGetMixedTypeKernel(MixedTypeKernelKey key) - { - if (!Enabled) - return null; - - try - { - return _mixedTypeCache.GetOrAdd(key, GenerateMixedTypeKernel); - } - catch - { - return null; - } - } - - /// - /// Generate a mixed-type kernel for the specified key. - /// - private static MixedTypeKernel GenerateMixedTypeKernel(MixedTypeKernelKey key) - { - return key.Path switch - { - ExecutionPath.SimdFull => GenerateSimdFullKernel(key), - ExecutionPath.SimdScalarRight => GenerateSimdScalarRightKernel(key), - ExecutionPath.SimdScalarLeft => GenerateSimdScalarLeftKernel(key), - ExecutionPath.SimdChunk => GenerateSimdChunkKernel(key), - ExecutionPath.General => GenerateGeneralKernel(key), - _ => throw new NotSupportedException($"Path {key.Path} not supported") - }; - } - - #endregion - - #region Path-Specific Kernel Generation - - /// - /// Generate a SimdFull kernel for contiguous arrays (both operands contiguous). - /// Uses Vector256 SIMD for supported types and operations, scalar loop otherwise. - /// - private static MixedTypeKernel GenerateSimdFullKernel(MixedTypeKernelKey key) - { - // MixedTypeKernel signature: - // void(void* lhs, void* rhs, void* result, int* lhsStrides, int* rhsStrides, int* shape, int ndim, int totalSize) - var dm = new DynamicMethod( - name: $"MixedType_SimdFull_{key}", - returnType: typeof(void), - parameterTypes: new[] - { - typeof(void*), typeof(void*), typeof(void*), - typeof(int*), typeof(int*), typeof(int*), - typeof(int), typeof(int) - }, - owner: typeof(ILKernelGenerator), - skipVisibility: true - ); - - var il = dm.GetILGenerator(); - - int lhsSize = GetTypeSize(key.LhsType); - int rhsSize = GetTypeSize(key.RhsType); - int resultSize = GetTypeSize(key.ResultType); - - // Can only use SIMD for same-type, supported types, and supported operations - // Mod doesn't have SIMD support (no Vector256 modulo operator) - bool canSimd = CanUseSimd(key.ResultType) && key.IsSameType && CanUseSimdForOp(key.Op); - - if (canSimd) - { - EmitSimdFullLoop(il, key, lhsSize, rhsSize, resultSize); - } - else - { - EmitScalarFullLoop(il, key, lhsSize, rhsSize, resultSize); - } - - il.Emit(OpCodes.Ret); - return dm.CreateDelegate(); - } - - /// - /// Check if operation has SIMD support via Vector256. - /// - private static bool CanUseSimdForOp(BinaryOp op) - { - // Only Add, Subtract, Multiply, Divide have Vector256 operators - // Mod requires scalar implementation - return op == BinaryOp.Add || op == BinaryOp.Subtract || - op == BinaryOp.Multiply || op == BinaryOp.Divide; - } - - /// - /// Generate a SimdScalarRight kernel (right operand is scalar). - /// Uses SIMD when LHS type equals result type (no per-element conversion needed). - /// - private static MixedTypeKernel GenerateSimdScalarRightKernel(MixedTypeKernelKey key) - { - var dm = new DynamicMethod( - name: $"MixedType_SimdScalarRight_{key}", - returnType: typeof(void), - parameterTypes: new[] - { - typeof(void*), typeof(void*), typeof(void*), - typeof(int*), typeof(int*), typeof(int*), - typeof(int), typeof(int) - }, - owner: typeof(ILKernelGenerator), - skipVisibility: true - ); - - var il = dm.GetILGenerator(); - - int lhsSize = GetTypeSize(key.LhsType); - int rhsSize = GetTypeSize(key.RhsType); - int resultSize = GetTypeSize(key.ResultType); - - // Use SIMD when: LHS type == Result type (no per-element conversion needed), - // result type supports SIMD, and operation has SIMD support - bool canUseSimd = key.LhsType == key.ResultType && - CanUseSimd(key.ResultType) && - CanUseSimdForOp(key.Op); - - if (canUseSimd) - { - EmitSimdScalarRightLoop(il, key, resultSize); - } - else - { - EmitScalarRightLoop(il, key, lhsSize, rhsSize, resultSize); - } - - il.Emit(OpCodes.Ret); - return dm.CreateDelegate(); - } - - /// - /// Generate a SimdScalarLeft kernel (left operand is scalar). - /// Uses SIMD when RHS type equals result type (no per-element conversion needed). - /// - private static MixedTypeKernel GenerateSimdScalarLeftKernel(MixedTypeKernelKey key) - { - var dm = new DynamicMethod( - name: $"MixedType_SimdScalarLeft_{key}", - returnType: typeof(void), - parameterTypes: new[] - { - typeof(void*), typeof(void*), typeof(void*), - typeof(int*), typeof(int*), typeof(int*), - typeof(int), typeof(int) - }, - owner: typeof(ILKernelGenerator), - skipVisibility: true - ); - - var il = dm.GetILGenerator(); - - int lhsSize = GetTypeSize(key.LhsType); - int rhsSize = GetTypeSize(key.RhsType); - int resultSize = GetTypeSize(key.ResultType); - - // Use SIMD when: RHS type == Result type (no per-element conversion needed), - // result type supports SIMD, and operation has SIMD support - bool canUseSimd = key.RhsType == key.ResultType && - CanUseSimd(key.ResultType) && - CanUseSimdForOp(key.Op); - - if (canUseSimd) - { - EmitSimdScalarLeftLoop(il, key, resultSize); - } - else - { - EmitScalarLeftLoop(il, key, lhsSize, rhsSize, resultSize); - } - - il.Emit(OpCodes.Ret); - return dm.CreateDelegate(); - } - - /// - /// Generate a SimdChunk kernel (inner dimension contiguous/broadcast). - /// - private static MixedTypeKernel GenerateSimdChunkKernel(MixedTypeKernelKey key) - { - var dm = new DynamicMethod( - name: $"MixedType_SimdChunk_{key}", - returnType: typeof(void), - parameterTypes: new[] - { - typeof(void*), typeof(void*), typeof(void*), - typeof(int*), typeof(int*), typeof(int*), - typeof(int), typeof(int) - }, - owner: typeof(ILKernelGenerator), - skipVisibility: true - ); - - var il = dm.GetILGenerator(); - - int lhsSize = GetTypeSize(key.LhsType); - int rhsSize = GetTypeSize(key.RhsType); - int resultSize = GetTypeSize(key.ResultType); - - EmitChunkLoop(il, key, lhsSize, rhsSize, resultSize); - - il.Emit(OpCodes.Ret); - return dm.CreateDelegate(); - } - - /// - /// Generate a General kernel (arbitrary strides, coordinate-based iteration). - /// - private static MixedTypeKernel GenerateGeneralKernel(MixedTypeKernelKey key) - { - var dm = new DynamicMethod( - name: $"MixedType_General_{key}", - returnType: typeof(void), - parameterTypes: new[] - { - typeof(void*), typeof(void*), typeof(void*), - typeof(int*), typeof(int*), typeof(int*), - typeof(int), typeof(int) - }, - owner: typeof(ILKernelGenerator), - skipVisibility: true - ); - - var il = dm.GetILGenerator(); - - int lhsSize = GetTypeSize(key.LhsType); - int rhsSize = GetTypeSize(key.RhsType); - int resultSize = GetTypeSize(key.ResultType); - - EmitGeneralLoop(il, key, lhsSize, rhsSize, resultSize); - - il.Emit(OpCodes.Ret); - return dm.CreateDelegate(); - } - - #endregion - - #region IL Loop Emission - - /// - /// Emit a scalar loop for contiguous arrays (no SIMD). - /// - private static void EmitScalarFullLoop(ILGenerator il, MixedTypeKernelKey key, - int lhsSize, int rhsSize, int resultSize) - { - // Args: void* lhs (0), void* rhs (1), void* result (2), - // int* lhsStrides (3), int* rhsStrides (4), int* shape (5), - // int ndim (6), int totalSize (7) - - var locI = il.DeclareLocal(typeof(int)); // loop counter - - var lblLoop = il.DefineLabel(); - var lblLoopEnd = il.DefineLabel(); - - // i = 0 - il.Emit(OpCodes.Ldc_I4_0); - il.Emit(OpCodes.Stloc, locI); - - il.MarkLabel(lblLoop); - - // if (i >= totalSize) goto end - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize - il.Emit(OpCodes.Bge, lblLoopEnd); - - // result[i] = op(lhs[i], rhs[i]) - // Load result address - il.Emit(OpCodes.Ldarg_2); // result - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4, resultSize); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - - // Load lhs[i] and convert to result type - il.Emit(OpCodes.Ldarg_0); // lhs - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4, lhsSize); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - EmitLoadIndirect(il, key.LhsType); - EmitConvertTo(il, key.LhsType, key.ResultType); - - // Load rhs[i] and convert to result type - il.Emit(OpCodes.Ldarg_1); // rhs - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4, rhsSize); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - EmitLoadIndirect(il, key.RhsType); - EmitConvertTo(il, key.RhsType, key.ResultType); - - // Perform operation - EmitScalarOperation(il, key.Op, key.ResultType); - - // Store result - EmitStoreIndirect(il, key.ResultType); - - // i++ - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Ldc_I4_1); - il.Emit(OpCodes.Add); - il.Emit(OpCodes.Stloc, locI); - - il.Emit(OpCodes.Br, lblLoop); - il.MarkLabel(lblLoopEnd); - } - - /// - /// Emit a SIMD loop for contiguous same-type arrays. - /// - private static void EmitSimdFullLoop(ILGenerator il, MixedTypeKernelKey key, - int lhsSize, int rhsSize, int resultSize) - { - // For same-type operations, use Vector256 - int vectorCount = GetVectorCount(key.ResultType); - - var locI = il.DeclareLocal(typeof(int)); // loop counter - var locVectorEnd = il.DeclareLocal(typeof(int)); // totalSize - vectorCount - - var lblSimdLoop = il.DefineLabel(); - var lblSimdLoopEnd = il.DefineLabel(); - var lblTailLoop = il.DefineLabel(); - var lblTailLoopEnd = il.DefineLabel(); - - // vectorEnd = totalSize - vectorCount - il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize - il.Emit(OpCodes.Ldc_I4, vectorCount); - il.Emit(OpCodes.Sub); - il.Emit(OpCodes.Stloc, locVectorEnd); - - // i = 0 - il.Emit(OpCodes.Ldc_I4_0); - il.Emit(OpCodes.Stloc, locI); - - // === SIMD LOOP === - il.MarkLabel(lblSimdLoop); - - // if (i > vectorEnd) goto SimdLoopEnd - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Ldloc, locVectorEnd); - il.Emit(OpCodes.Bgt, lblSimdLoopEnd); - - // Load lhs vector - il.Emit(OpCodes.Ldarg_0); // lhs - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4, lhsSize); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - EmitVectorLoad(il, key.LhsType); - - // Load rhs vector - il.Emit(OpCodes.Ldarg_1); // rhs - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4, rhsSize); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - EmitVectorLoad(il, key.RhsType); - - // Vector operation - EmitVectorOperation(il, key.Op, key.ResultType); - - // Store result vector - il.Emit(OpCodes.Ldarg_2); // result - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4, resultSize); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - EmitVectorStore(il, key.ResultType); - - // i += vectorCount - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Ldc_I4, vectorCount); - il.Emit(OpCodes.Add); - il.Emit(OpCodes.Stloc, locI); - - il.Emit(OpCodes.Br, lblSimdLoop); - il.MarkLabel(lblSimdLoopEnd); - - // === TAIL LOOP === - il.MarkLabel(lblTailLoop); - - // if (i >= totalSize) goto end - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize - il.Emit(OpCodes.Bge, lblTailLoopEnd); - - // result[i] = op(lhs[i], rhs[i]) - il.Emit(OpCodes.Ldarg_2); // result - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4, resultSize); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - - il.Emit(OpCodes.Ldarg_0); // lhs - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4, lhsSize); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - EmitLoadIndirect(il, key.LhsType); - - il.Emit(OpCodes.Ldarg_1); // rhs - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4, rhsSize); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - EmitLoadIndirect(il, key.RhsType); - - EmitScalarOperation(il, key.Op, key.ResultType); - EmitStoreIndirect(il, key.ResultType); - - // i++ - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Ldc_I4_1); - il.Emit(OpCodes.Add); - il.Emit(OpCodes.Stloc, locI); - - il.Emit(OpCodes.Br, lblTailLoop); - il.MarkLabel(lblTailLoopEnd); - } - - /// - /// Emit loop for scalar right operand (broadcast scalar to array). - /// - private static void EmitScalarRightLoop(ILGenerator il, MixedTypeKernelKey key, - int lhsSize, int rhsSize, int resultSize) - { - var locI = il.DeclareLocal(typeof(int)); // loop counter - var locRhsVal = il.DeclareLocal(GetClrType(key.ResultType)); // scalar value - - var lblLoop = il.DefineLabel(); - var lblLoopEnd = il.DefineLabel(); - - // Load rhs[0] and convert to result type, store in local - il.Emit(OpCodes.Ldarg_1); // rhs - EmitLoadIndirect(il, key.RhsType); - EmitConvertTo(il, key.RhsType, key.ResultType); - il.Emit(OpCodes.Stloc, locRhsVal); - - // i = 0 - il.Emit(OpCodes.Ldc_I4_0); - il.Emit(OpCodes.Stloc, locI); - - il.MarkLabel(lblLoop); - - // if (i >= totalSize) goto end - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize - il.Emit(OpCodes.Bge, lblLoopEnd); - - // result[i] = op(lhs[i], rhsVal) - il.Emit(OpCodes.Ldarg_2); // result - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4, resultSize); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - - // Load lhs[i] and convert - il.Emit(OpCodes.Ldarg_0); // lhs - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4, lhsSize); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - EmitLoadIndirect(il, key.LhsType); - EmitConvertTo(il, key.LhsType, key.ResultType); - - // Load cached rhs scalar - il.Emit(OpCodes.Ldloc, locRhsVal); - - EmitScalarOperation(il, key.Op, key.ResultType); - EmitStoreIndirect(il, key.ResultType); - - // i++ - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Ldc_I4_1); - il.Emit(OpCodes.Add); - il.Emit(OpCodes.Stloc, locI); - - il.Emit(OpCodes.Br, lblLoop); - il.MarkLabel(lblLoopEnd); - } - - /// - /// Emit loop for scalar left operand (broadcast scalar to array). - /// - private static void EmitScalarLeftLoop(ILGenerator il, MixedTypeKernelKey key, - int lhsSize, int rhsSize, int resultSize) - { - var locI = il.DeclareLocal(typeof(int)); // loop counter - var locLhsVal = il.DeclareLocal(GetClrType(key.ResultType)); // scalar value - - var lblLoop = il.DefineLabel(); - var lblLoopEnd = il.DefineLabel(); - - // Load lhs[0] and convert to result type, store in local - il.Emit(OpCodes.Ldarg_0); // lhs - EmitLoadIndirect(il, key.LhsType); - EmitConvertTo(il, key.LhsType, key.ResultType); - il.Emit(OpCodes.Stloc, locLhsVal); - - // i = 0 - il.Emit(OpCodes.Ldc_I4_0); - il.Emit(OpCodes.Stloc, locI); - - il.MarkLabel(lblLoop); - - // if (i >= totalSize) goto end - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize - il.Emit(OpCodes.Bge, lblLoopEnd); - - // result[i] = op(lhsVal, rhs[i]) - il.Emit(OpCodes.Ldarg_2); // result - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4, resultSize); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - - // Load cached lhs scalar - il.Emit(OpCodes.Ldloc, locLhsVal); - - // Load rhs[i] and convert - il.Emit(OpCodes.Ldarg_1); // rhs - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4, rhsSize); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - EmitLoadIndirect(il, key.RhsType); - EmitConvertTo(il, key.RhsType, key.ResultType); - - EmitScalarOperation(il, key.Op, key.ResultType); - EmitStoreIndirect(il, key.ResultType); - - // i++ - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Ldc_I4_1); - il.Emit(OpCodes.Add); - il.Emit(OpCodes.Stloc, locI); - - il.Emit(OpCodes.Br, lblLoop); - il.MarkLabel(lblLoopEnd); - } - - /// - /// Emit SIMD loop for scalar right operand (broadcast scalar to vector). - /// Requires: LHS type == Result type (no per-element conversion needed). - /// - private static void EmitSimdScalarRightLoop(ILGenerator il, MixedTypeKernelKey key, int elemSize) - { - // Args: void* lhs (0), void* rhs (1), void* result (2), - // int* lhsStrides (3), int* rhsStrides (4), int* shape (5), - // int ndim (6), int totalSize (7) - - int vectorCount = GetVectorCount(key.ResultType); - var clrType = GetClrType(key.ResultType); - var vectorType = typeof(Vector256<>).MakeGenericType(clrType); - - var locI = il.DeclareLocal(typeof(int)); // loop counter - var locVectorEnd = il.DeclareLocal(typeof(int)); // totalSize - vectorCount - var locScalarVec = il.DeclareLocal(vectorType); // broadcasted scalar vector - - var lblSimdLoop = il.DefineLabel(); - var lblSimdLoopEnd = il.DefineLabel(); - var lblTailLoop = il.DefineLabel(); - var lblTailLoopEnd = il.DefineLabel(); - - // === Load scalar, convert to result type, broadcast to vector === - // Load rhs[0] (the scalar) - il.Emit(OpCodes.Ldarg_1); // rhs - EmitLoadIndirect(il, key.RhsType); - // Convert to result type if needed - if (key.RhsType != key.ResultType) - { - EmitConvertTo(il, key.RhsType, key.ResultType); - } - // Broadcast to Vector256: Vector256.Create(scalar) - EmitVectorCreate(il, key.ResultType); - il.Emit(OpCodes.Stloc, locScalarVec); - - // vectorEnd = totalSize - vectorCount - il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize - il.Emit(OpCodes.Ldc_I4, vectorCount); - il.Emit(OpCodes.Sub); - il.Emit(OpCodes.Stloc, locVectorEnd); - - // i = 0 - il.Emit(OpCodes.Ldc_I4_0); - il.Emit(OpCodes.Stloc, locI); - - // === SIMD LOOP === - il.MarkLabel(lblSimdLoop); - - // if (i > vectorEnd) goto SimdLoopEnd - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Ldloc, locVectorEnd); - il.Emit(OpCodes.Bgt, lblSimdLoopEnd); - - // Load lhs vector: Vector256.Load(lhs + i * elemSize) - il.Emit(OpCodes.Ldarg_0); // lhs - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4, elemSize); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - EmitVectorLoad(il, key.LhsType); - - // Load scalar vector - il.Emit(OpCodes.Ldloc, locScalarVec); - - // Vector operation: lhsVec op scalarVec - EmitVectorOperation(il, key.Op, key.ResultType); - - // Store result vector: Vector256.Store(resultVec, result + i * elemSize) - il.Emit(OpCodes.Ldarg_2); // result - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4, elemSize); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - EmitVectorStore(il, key.ResultType); - - // i += vectorCount - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Ldc_I4, vectorCount); - il.Emit(OpCodes.Add); - il.Emit(OpCodes.Stloc, locI); - - il.Emit(OpCodes.Br, lblSimdLoop); - il.MarkLabel(lblSimdLoopEnd); - - // === TAIL LOOP (scalar remainder) === - // Load scalar value once for tail loop - var locScalarVal = il.DeclareLocal(clrType); - il.Emit(OpCodes.Ldarg_1); // rhs - EmitLoadIndirect(il, key.RhsType); - if (key.RhsType != key.ResultType) - { - EmitConvertTo(il, key.RhsType, key.ResultType); - } - il.Emit(OpCodes.Stloc, locScalarVal); - - il.MarkLabel(lblTailLoop); - - // if (i >= totalSize) goto end - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize - il.Emit(OpCodes.Bge, lblTailLoopEnd); - - // result[i] = lhs[i] op scalarVal - il.Emit(OpCodes.Ldarg_2); // result - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4, elemSize); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - - il.Emit(OpCodes.Ldarg_0); // lhs - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4, elemSize); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - EmitLoadIndirect(il, key.LhsType); - - il.Emit(OpCodes.Ldloc, locScalarVal); - - EmitScalarOperation(il, key.Op, key.ResultType); - EmitStoreIndirect(il, key.ResultType); - - // i++ - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Ldc_I4_1); - il.Emit(OpCodes.Add); - il.Emit(OpCodes.Stloc, locI); - - il.Emit(OpCodes.Br, lblTailLoop); - il.MarkLabel(lblTailLoopEnd); - } - - /// - /// Emit SIMD loop for scalar left operand (broadcast scalar to vector). - /// Requires: RHS type == Result type (no per-element conversion needed). - /// - private static void EmitSimdScalarLeftLoop(ILGenerator il, MixedTypeKernelKey key, int elemSize) - { - // Args: void* lhs (0), void* rhs (1), void* result (2), - // int* lhsStrides (3), int* rhsStrides (4), int* shape (5), - // int ndim (6), int totalSize (7) - - int vectorCount = GetVectorCount(key.ResultType); - var clrType = GetClrType(key.ResultType); - var vectorType = typeof(Vector256<>).MakeGenericType(clrType); - - var locI = il.DeclareLocal(typeof(int)); // loop counter - var locVectorEnd = il.DeclareLocal(typeof(int)); // totalSize - vectorCount - var locScalarVec = il.DeclareLocal(vectorType); // broadcasted scalar vector - - var lblSimdLoop = il.DefineLabel(); - var lblSimdLoopEnd = il.DefineLabel(); - var lblTailLoop = il.DefineLabel(); - var lblTailLoopEnd = il.DefineLabel(); - - // === Load scalar, convert to result type, broadcast to vector === - // Load lhs[0] (the scalar) - il.Emit(OpCodes.Ldarg_0); // lhs - EmitLoadIndirect(il, key.LhsType); - // Convert to result type if needed - if (key.LhsType != key.ResultType) - { - EmitConvertTo(il, key.LhsType, key.ResultType); - } - // Broadcast to Vector256: Vector256.Create(scalar) - EmitVectorCreate(il, key.ResultType); - il.Emit(OpCodes.Stloc, locScalarVec); - - // vectorEnd = totalSize - vectorCount - il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize - il.Emit(OpCodes.Ldc_I4, vectorCount); - il.Emit(OpCodes.Sub); - il.Emit(OpCodes.Stloc, locVectorEnd); - - // i = 0 - il.Emit(OpCodes.Ldc_I4_0); - il.Emit(OpCodes.Stloc, locI); - - // === SIMD LOOP === - il.MarkLabel(lblSimdLoop); - - // if (i > vectorEnd) goto SimdLoopEnd - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Ldloc, locVectorEnd); - il.Emit(OpCodes.Bgt, lblSimdLoopEnd); - - // Load scalar vector - il.Emit(OpCodes.Ldloc, locScalarVec); - - // Load rhs vector: Vector256.Load(rhs + i * elemSize) - il.Emit(OpCodes.Ldarg_1); // rhs - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4, elemSize); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - EmitVectorLoad(il, key.RhsType); - - // Vector operation: scalarVec op rhsVec - EmitVectorOperation(il, key.Op, key.ResultType); - - // Store result vector: Vector256.Store(resultVec, result + i * elemSize) - il.Emit(OpCodes.Ldarg_2); // result - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4, elemSize); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - EmitVectorStore(il, key.ResultType); - - // i += vectorCount - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Ldc_I4, vectorCount); - il.Emit(OpCodes.Add); - il.Emit(OpCodes.Stloc, locI); - - il.Emit(OpCodes.Br, lblSimdLoop); - il.MarkLabel(lblSimdLoopEnd); - - // === TAIL LOOP (scalar remainder) === - // Load scalar value once for tail loop - var locScalarVal = il.DeclareLocal(clrType); - il.Emit(OpCodes.Ldarg_0); // lhs - EmitLoadIndirect(il, key.LhsType); - if (key.LhsType != key.ResultType) - { - EmitConvertTo(il, key.LhsType, key.ResultType); - } - il.Emit(OpCodes.Stloc, locScalarVal); - - il.MarkLabel(lblTailLoop); - - // if (i >= totalSize) goto end - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize - il.Emit(OpCodes.Bge, lblTailLoopEnd); - - // result[i] = scalarVal op rhs[i] - il.Emit(OpCodes.Ldarg_2); // result - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4, elemSize); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - - il.Emit(OpCodes.Ldloc, locScalarVal); - - il.Emit(OpCodes.Ldarg_1); // rhs - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4, elemSize); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - EmitLoadIndirect(il, key.RhsType); - - EmitScalarOperation(il, key.Op, key.ResultType); - EmitStoreIndirect(il, key.ResultType); - - // i++ - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Ldc_I4_1); - il.Emit(OpCodes.Add); - il.Emit(OpCodes.Stloc, locI); - - il.Emit(OpCodes.Br, lblTailLoop); - il.MarkLabel(lblTailLoopEnd); - } - - /// - /// Emit chunked loop for inner-contiguous arrays. - /// This is more complex - processes the inner dimension as a chunk. - /// - private static void EmitChunkLoop(ILGenerator il, MixedTypeKernelKey key, - int lhsSize, int rhsSize, int resultSize) - { - // For simplicity in initial implementation, use general loop - // TODO: Implement proper chunked SIMD processing - EmitGeneralLoop(il, key, lhsSize, rhsSize, resultSize); - } - - /// - /// Emit general coordinate-based iteration loop. - /// Handles arbitrary strides. - /// - private static void EmitGeneralLoop(ILGenerator il, MixedTypeKernelKey key, - int lhsSize, int rhsSize, int resultSize) - { - // Args: void* lhs (0), void* rhs (1), void* result (2), - // int* lhsStrides (3), int* rhsStrides (4), int* shape (5), - // int ndim (6), int totalSize (7) - - var locI = il.DeclareLocal(typeof(int)); // linear index - var locD = il.DeclareLocal(typeof(int)); // dimension counter - var locLhsOffset = il.DeclareLocal(typeof(int)); // lhs offset - var locRhsOffset = il.DeclareLocal(typeof(int)); // rhs offset - var locCoord = il.DeclareLocal(typeof(int)); // current coordinate - var locIdx = il.DeclareLocal(typeof(int)); // temp for coordinate calculation - - var lblLoop = il.DefineLabel(); - var lblLoopEnd = il.DefineLabel(); - var lblDimLoop = il.DefineLabel(); - var lblDimLoopEnd = il.DefineLabel(); - - // i = 0 - il.Emit(OpCodes.Ldc_I4_0); - il.Emit(OpCodes.Stloc, locI); - - // Main loop - il.MarkLabel(lblLoop); - - // if (i >= totalSize) goto end - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize - il.Emit(OpCodes.Bge, lblLoopEnd); - - // Calculate lhsOffset and rhsOffset from linear index - // lhsOffset = 0, rhsOffset = 0 - il.Emit(OpCodes.Ldc_I4_0); - il.Emit(OpCodes.Stloc, locLhsOffset); - il.Emit(OpCodes.Ldc_I4_0); - il.Emit(OpCodes.Stloc, locRhsOffset); - - // idx = i (for coordinate calculation) - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Stloc, locIdx); - - // For each dimension (right to left): coord = idx % shape[d], idx /= shape[d] - // d = ndim - 1 - il.Emit(OpCodes.Ldarg_S, (byte)6); // ndim - il.Emit(OpCodes.Ldc_I4_1); - il.Emit(OpCodes.Sub); - il.Emit(OpCodes.Stloc, locD); - - il.MarkLabel(lblDimLoop); - - // if (d < 0) goto DimLoopEnd - il.Emit(OpCodes.Ldloc, locD); - il.Emit(OpCodes.Ldc_I4_0); - il.Emit(OpCodes.Blt, lblDimLoopEnd); - - // coord = idx % shape[d] - il.Emit(OpCodes.Ldloc, locIdx); - il.Emit(OpCodes.Ldarg_S, (byte)5); // shape - il.Emit(OpCodes.Ldloc, locD); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4_4); // sizeof(int) - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - il.Emit(OpCodes.Ldind_I4); - il.Emit(OpCodes.Rem); - il.Emit(OpCodes.Stloc, locCoord); - - // idx /= shape[d] - il.Emit(OpCodes.Ldloc, locIdx); - il.Emit(OpCodes.Ldarg_S, (byte)5); // shape - il.Emit(OpCodes.Ldloc, locD); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4_4); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - il.Emit(OpCodes.Ldind_I4); - il.Emit(OpCodes.Div); - il.Emit(OpCodes.Stloc, locIdx); - - // lhsOffset += coord * lhsStrides[d] - il.Emit(OpCodes.Ldloc, locLhsOffset); - il.Emit(OpCodes.Ldloc, locCoord); - il.Emit(OpCodes.Ldarg_3); // lhsStrides - il.Emit(OpCodes.Ldloc, locD); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4_4); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - il.Emit(OpCodes.Ldind_I4); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - il.Emit(OpCodes.Stloc, locLhsOffset); - - // rhsOffset += coord * rhsStrides[d] - il.Emit(OpCodes.Ldloc, locRhsOffset); - il.Emit(OpCodes.Ldloc, locCoord); - il.Emit(OpCodes.Ldarg_S, (byte)4); // rhsStrides - il.Emit(OpCodes.Ldloc, locD); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4_4); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - il.Emit(OpCodes.Ldind_I4); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - il.Emit(OpCodes.Stloc, locRhsOffset); - - // d-- - il.Emit(OpCodes.Ldloc, locD); - il.Emit(OpCodes.Ldc_I4_1); - il.Emit(OpCodes.Sub); - il.Emit(OpCodes.Stloc, locD); - - il.Emit(OpCodes.Br, lblDimLoop); - il.MarkLabel(lblDimLoopEnd); - - // Now compute: result[i] = op(lhs[lhsOffset], rhs[rhsOffset]) - // Load result address (contiguous output) - il.Emit(OpCodes.Ldarg_2); // result - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4, resultSize); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - - // Load lhs[lhsOffset] - il.Emit(OpCodes.Ldarg_0); // lhs - il.Emit(OpCodes.Ldloc, locLhsOffset); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4, lhsSize); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - EmitLoadIndirect(il, key.LhsType); - EmitConvertTo(il, key.LhsType, key.ResultType); - - // Load rhs[rhsOffset] - il.Emit(OpCodes.Ldarg_1); // rhs - il.Emit(OpCodes.Ldloc, locRhsOffset); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4, rhsSize); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - EmitLoadIndirect(il, key.RhsType); - EmitConvertTo(il, key.RhsType, key.ResultType); - - // Operation - EmitScalarOperation(il, key.Op, key.ResultType); - - // Store - EmitStoreIndirect(il, key.ResultType); - - // i++ - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Ldc_I4_1); - il.Emit(OpCodes.Add); - il.Emit(OpCodes.Stloc, locI); - - il.Emit(OpCodes.Br, lblLoop); - il.MarkLabel(lblLoopEnd); - } - - #endregion - - #region NPTypeCode-Based IL Helpers - - /// - /// Get size in bytes for NPTypeCode. - /// - internal static int GetTypeSize(NPTypeCode type) - { - return type switch - { - NPTypeCode.Boolean => 1, - NPTypeCode.Byte => 1, - NPTypeCode.Int16 => 2, - NPTypeCode.UInt16 => 2, - NPTypeCode.Int32 => 4, - NPTypeCode.UInt32 => 4, - NPTypeCode.Int64 => 8, - NPTypeCode.UInt64 => 8, - NPTypeCode.Char => 2, - NPTypeCode.Single => 4, - NPTypeCode.Double => 8, - NPTypeCode.Decimal => 16, - _ => throw new NotSupportedException($"Type {type} not supported") - }; - } - - /// - /// Get CLR Type for NPTypeCode. - /// - internal static Type GetClrType(NPTypeCode type) - { - return type switch - { - NPTypeCode.Boolean => typeof(bool), - NPTypeCode.Byte => typeof(byte), - NPTypeCode.Int16 => typeof(short), - NPTypeCode.UInt16 => typeof(ushort), - NPTypeCode.Int32 => typeof(int), - NPTypeCode.UInt32 => typeof(uint), - NPTypeCode.Int64 => typeof(long), - NPTypeCode.UInt64 => typeof(ulong), - NPTypeCode.Char => typeof(char), - NPTypeCode.Single => typeof(float), - NPTypeCode.Double => typeof(double), - NPTypeCode.Decimal => typeof(decimal), - _ => throw new NotSupportedException($"Type {type} not supported") - }; - } - - /// - /// Check if type supports SIMD operations (V128/V256/V512). - /// - internal static bool CanUseSimd(NPTypeCode type) - { - if (VectorBits == 0) return false; // No SIMD hardware - - return type switch - { - NPTypeCode.Byte => true, - NPTypeCode.Int16 or NPTypeCode.UInt16 => true, - NPTypeCode.Int32 or NPTypeCode.UInt32 => true, - NPTypeCode.Int64 or NPTypeCode.UInt64 => true, - NPTypeCode.Single or NPTypeCode.Double => true, - _ => false // Boolean, Char, Decimal - }; - } - - /// - /// Get vector element count for type (adapts to V128/V256/V512). - /// - internal static int GetVectorCount(NPTypeCode type) - { - if (VectorBits == 0) return 1; // Scalar fallback - return VectorBytes / GetTypeSize(type); - } - - /// - /// Emit load indirect for NPTypeCode. - /// - internal static void EmitLoadIndirect(ILGenerator il, NPTypeCode type) - { - switch (type) - { - case NPTypeCode.Boolean: - case NPTypeCode.Byte: - il.Emit(OpCodes.Ldind_U1); - break; - case NPTypeCode.Int16: - il.Emit(OpCodes.Ldind_I2); - break; - case NPTypeCode.UInt16: - case NPTypeCode.Char: - il.Emit(OpCodes.Ldind_U2); - break; - case NPTypeCode.Int32: - il.Emit(OpCodes.Ldind_I4); - break; - case NPTypeCode.UInt32: - il.Emit(OpCodes.Ldind_U4); - break; - case NPTypeCode.Int64: - case NPTypeCode.UInt64: - il.Emit(OpCodes.Ldind_I8); - break; - case NPTypeCode.Single: - il.Emit(OpCodes.Ldind_R4); - break; - case NPTypeCode.Double: - il.Emit(OpCodes.Ldind_R8); - break; - case NPTypeCode.Decimal: - il.Emit(OpCodes.Ldobj, typeof(decimal)); - break; - default: - throw new NotSupportedException($"Type {type} not supported for ldind"); - } - } - - /// - /// Emit store indirect for NPTypeCode. - /// - internal static void EmitStoreIndirect(ILGenerator il, NPTypeCode type) - { - switch (type) - { - case NPTypeCode.Boolean: - case NPTypeCode.Byte: - il.Emit(OpCodes.Stind_I1); - break; - case NPTypeCode.Int16: - case NPTypeCode.UInt16: - case NPTypeCode.Char: - il.Emit(OpCodes.Stind_I2); - break; - case NPTypeCode.Int32: - case NPTypeCode.UInt32: - il.Emit(OpCodes.Stind_I4); - break; - case NPTypeCode.Int64: - case NPTypeCode.UInt64: - il.Emit(OpCodes.Stind_I8); - break; - case NPTypeCode.Single: - il.Emit(OpCodes.Stind_R4); - break; - case NPTypeCode.Double: - il.Emit(OpCodes.Stind_R8); - break; - case NPTypeCode.Decimal: - il.Emit(OpCodes.Stobj, typeof(decimal)); - break; - default: - throw new NotSupportedException($"Type {type} not supported for stind"); - } - } - - /// - /// Emit type conversion from source to target type. - /// - internal static void EmitConvertTo(ILGenerator il, NPTypeCode from, NPTypeCode to) - { - if (from == to) - return; // No conversion needed - - // Special case: decimal conversions require method calls - if (from == NPTypeCode.Decimal || to == NPTypeCode.Decimal) - { - EmitDecimalConversion(il, from, to); - return; - } - - // For numeric types, use conv.* opcodes - switch (to) - { - case NPTypeCode.Boolean: - // Convert to bool: != 0 - il.Emit(OpCodes.Ldc_I4_0); - il.Emit(OpCodes.Cgt_Un); - break; - case NPTypeCode.Byte: - il.Emit(OpCodes.Conv_U1); - break; - case NPTypeCode.Int16: - il.Emit(OpCodes.Conv_I2); - break; - case NPTypeCode.UInt16: - case NPTypeCode.Char: - il.Emit(OpCodes.Conv_U2); - break; - case NPTypeCode.Int32: - il.Emit(OpCodes.Conv_I4); - break; - case NPTypeCode.UInt32: - il.Emit(OpCodes.Conv_U4); - break; - case NPTypeCode.Int64: - if (IsUnsigned(from)) - il.Emit(OpCodes.Conv_U8); - else - il.Emit(OpCodes.Conv_I8); - break; - case NPTypeCode.UInt64: - il.Emit(OpCodes.Conv_U8); - break; - case NPTypeCode.Single: - if (IsUnsigned(from)) - il.Emit(OpCodes.Conv_R_Un); - il.Emit(OpCodes.Conv_R4); - break; - case NPTypeCode.Double: - if (IsUnsigned(from)) - il.Emit(OpCodes.Conv_R_Un); - il.Emit(OpCodes.Conv_R8); - break; - default: - throw new NotSupportedException($"Conversion to {to} not supported"); - } - } - - /// - /// Emit decimal-specific conversions. - /// - private static void EmitDecimalConversion(ILGenerator il, NPTypeCode from, NPTypeCode to) - { - if (to == NPTypeCode.Decimal) - { - // Convert to decimal - need to handle bool/char first - if (from == NPTypeCode.Boolean) - { - // bool -> int -> decimal - il.Emit(OpCodes.Conv_I4); - il.EmitCall(OpCodes.Call, typeof(decimal).GetMethod("op_Implicit", new[] { typeof(int) })!, null); - return; - } - if (from == NPTypeCode.Char) - { - // char -> int -> decimal - il.Emit(OpCodes.Conv_I4); - il.EmitCall(OpCodes.Call, typeof(decimal).GetMethod("op_Implicit", new[] { typeof(int) })!, null); - return; - } - - var method = from switch - { - NPTypeCode.Byte => typeof(decimal).GetMethod("op_Implicit", new[] { typeof(byte) }), - NPTypeCode.Int16 => typeof(decimal).GetMethod("op_Implicit", new[] { typeof(short) }), - NPTypeCode.UInt16 => typeof(decimal).GetMethod("op_Implicit", new[] { typeof(ushort) }), - NPTypeCode.Int32 => typeof(decimal).GetMethod("op_Implicit", new[] { typeof(int) }), - NPTypeCode.UInt32 => typeof(decimal).GetMethod("op_Implicit", new[] { typeof(uint) }), - NPTypeCode.Int64 => typeof(decimal).GetMethod("op_Implicit", new[] { typeof(long) }), - NPTypeCode.UInt64 => typeof(decimal).GetMethod("op_Implicit", new[] { typeof(ulong) }), - NPTypeCode.Single => typeof(decimal).GetMethod("op_Explicit", new[] { typeof(float) }), - NPTypeCode.Double => typeof(decimal).GetMethod("op_Explicit", new[] { typeof(double) }), - _ => throw new NotSupportedException($"Cannot convert {from} to decimal") - }; - il.EmitCall(OpCodes.Call, method!, null); - } - else - { - // Convert from decimal - need to handle bool/char - if (to == NPTypeCode.Boolean) - { - // decimal -> int -> bool (compare with 0) - il.EmitCall(OpCodes.Call, typeof(decimal).GetMethod("ToInt32", new[] { typeof(decimal) })!, null); - il.Emit(OpCodes.Ldc_I4_0); - il.Emit(OpCodes.Cgt_Un); - return; - } - if (to == NPTypeCode.Char) - { - // decimal -> int -> char - il.EmitCall(OpCodes.Call, typeof(decimal).GetMethod("ToInt32", new[] { typeof(decimal) })!, null); - il.Emit(OpCodes.Conv_U2); - return; - } - - var method = to switch - { - NPTypeCode.Byte => typeof(decimal).GetMethod("ToByte", new[] { typeof(decimal) }), - NPTypeCode.Int16 => typeof(decimal).GetMethod("ToInt16", new[] { typeof(decimal) }), - NPTypeCode.UInt16 => typeof(decimal).GetMethod("ToUInt16", new[] { typeof(decimal) }), - NPTypeCode.Int32 => typeof(decimal).GetMethod("ToInt32", new[] { typeof(decimal) }), - NPTypeCode.UInt32 => typeof(decimal).GetMethod("ToUInt32", new[] { typeof(decimal) }), - NPTypeCode.Int64 => typeof(decimal).GetMethod("ToInt64", new[] { typeof(decimal) }), - NPTypeCode.UInt64 => typeof(decimal).GetMethod("ToUInt64", new[] { typeof(decimal) }), - NPTypeCode.Single => typeof(decimal).GetMethod("ToSingle", new[] { typeof(decimal) }), - NPTypeCode.Double => typeof(decimal).GetMethod("ToDouble", new[] { typeof(decimal) }), - _ => throw new NotSupportedException($"Cannot convert decimal to {to}") - }; - il.EmitCall(OpCodes.Call, method!, null); - } - } - - /// - /// Check if type is unsigned. - /// - private static bool IsUnsigned(NPTypeCode type) - { - return type == NPTypeCode.Byte || type == NPTypeCode.UInt16 || - type == NPTypeCode.UInt32 || type == NPTypeCode.UInt64 || - type == NPTypeCode.Char; - } - - /// - /// Emit scalar operation for NPTypeCode. - /// - internal static void EmitScalarOperation(ILGenerator il, BinaryOp op, NPTypeCode resultType) - { - // Special handling for decimal (uses operator methods) - if (resultType == NPTypeCode.Decimal) - { - EmitDecimalOperation(il, op); - return; - } - - // Special handling for boolean - if (resultType == NPTypeCode.Boolean) - { - // For bool, only meaningful ops are probably logical, but we'll support arithmetic - // Treat as byte arithmetic - } - - var opcode = op switch - { - BinaryOp.Add => OpCodes.Add, - BinaryOp.Subtract => OpCodes.Sub, - BinaryOp.Multiply => OpCodes.Mul, - BinaryOp.Divide => IsUnsigned(resultType) ? OpCodes.Div_Un : OpCodes.Div, - BinaryOp.Mod => IsUnsigned(resultType) ? OpCodes.Rem_Un : OpCodes.Rem, - BinaryOp.BitwiseAnd => OpCodes.And, - BinaryOp.BitwiseOr => OpCodes.Or, - BinaryOp.BitwiseXor => OpCodes.Xor, - _ => throw new NotSupportedException($"Operation {op} not supported") - }; - - il.Emit(opcode); - } - - /// - /// Emit decimal-specific operation using operator methods. - /// - private static void EmitDecimalOperation(ILGenerator il, BinaryOp op) - { - // Bitwise operations not supported for decimal - if (op == BinaryOp.BitwiseAnd || op == BinaryOp.BitwiseOr || op == BinaryOp.BitwiseXor) - throw new NotSupportedException($"Bitwise operation {op} not supported for decimal type"); - - var methodName = op switch - { - BinaryOp.Add => "op_Addition", - BinaryOp.Subtract => "op_Subtraction", - BinaryOp.Multiply => "op_Multiply", - BinaryOp.Divide => "op_Division", - BinaryOp.Mod => "op_Modulus", - _ => throw new NotSupportedException($"Operation {op} not supported for decimal") - }; - - var method = typeof(decimal).GetMethod( - methodName, - BindingFlags.Public | BindingFlags.Static, - null, - new[] { typeof(decimal), typeof(decimal) }, - null - ); - - il.EmitCall(OpCodes.Call, method!, null); - } - - /// - /// Emit Vector.Load for NPTypeCode (adapts to V128/V256/V512). - /// - internal static void EmitVectorLoad(ILGenerator il, NPTypeCode type) - { - var containerType = GetVectorContainerType(); - var clrType = GetClrType(type); - - var loadMethod = containerType - .GetMethods(BindingFlags.Public | BindingFlags.Static) - .First(m => m.Name == "Load" && m.IsGenericMethod && - m.GetParameters().Length == 1 && - m.GetParameters()[0].ParameterType.IsPointer) - .MakeGenericMethod(clrType); - - il.EmitCall(OpCodes.Call, loadMethod, null); - } - - /// - /// Emit Vector.Create for NPTypeCode (broadcasts scalar to all vector elements). - /// Stack must have scalar value on top; result is Vector on stack. - /// - internal static void EmitVectorCreate(ILGenerator il, NPTypeCode type) - { - var containerType = GetVectorContainerType(); - var clrType = GetClrType(type); - - var createMethod = containerType - .GetMethods(BindingFlags.Public | BindingFlags.Static) - .First(m => m.Name == "Create" && m.IsGenericMethod && - m.GetParameters().Length == 1 && - !m.GetParameters()[0].ParameterType.IsPointer) - .MakeGenericMethod(clrType); - - il.EmitCall(OpCodes.Call, createMethod, null); - } - - /// - /// Emit Vector.Store for NPTypeCode (adapts to V128/V256/V512). - /// - internal static void EmitVectorStore(ILGenerator il, NPTypeCode type) - { - var containerType = GetVectorContainerType(); - var clrType = GetClrType(type); - - var storeMethod = containerType - .GetMethods(BindingFlags.Public | BindingFlags.Static) - .First(m => m.Name == "Store" && m.IsGenericMethod && - m.GetParameters().Length == 2 && - m.GetParameters()[0].ParameterType.IsGenericType) - .MakeGenericMethod(clrType); - - il.EmitCall(OpCodes.Call, storeMethod, null); - } - - /// - /// Emit Vector operation for NPTypeCode (adapts to V128/V256/V512). - /// - internal static void EmitVectorOperation(ILGenerator il, BinaryOp op, NPTypeCode type) - { - var clrType = GetClrType(type); - var vectorType = GetVectorType(clrType); - - string methodName = op switch - { - BinaryOp.Add => "op_Addition", - BinaryOp.Subtract => "op_Subtraction", - BinaryOp.Multiply => "op_Multiply", - BinaryOp.Divide => "op_Division", - _ => throw new NotSupportedException($"Operation {op} not supported for SIMD") - }; - - var opMethod = vectorType.GetMethod(methodName, - BindingFlags.Public | BindingFlags.Static, - null, new[] { vectorType, vectorType }, null); - - il.EmitCall(OpCodes.Call, opMethod!, null); - } - - #endregion - - #region Unary Kernel Generation - - /// - /// Cache for unary kernels. - /// Key: UnaryKernelKey (InputType, OutputType, Op, IsContiguous) - /// - private static readonly ConcurrentDictionary _unaryCache = new(); - - /// - /// Number of unary kernels in cache. - /// - public static int UnaryCachedCount => _unaryCache.Count; - - /// - /// Get or generate a unary kernel for the specified key. - /// - public static UnaryKernel GetUnaryKernel(UnaryKernelKey key) - { - if (!Enabled) - throw new InvalidOperationException("IL generation is disabled"); - - return _unaryCache.GetOrAdd(key, GenerateUnaryKernel); - } - - /// - /// Try to get or generate a unary kernel. Returns null if generation fails. - /// - public static UnaryKernel? TryGetUnaryKernel(UnaryKernelKey key) - { - if (!Enabled) - return null; - - try - { - return _unaryCache.GetOrAdd(key, GenerateUnaryKernel); - } - catch - { - return null; - } - } - - /// - /// Clear the unary kernel cache. - /// - public static void ClearUnary() => _unaryCache.Clear(); - - /// - /// Generate a unary kernel for the specified key. - /// - private static UnaryKernel GenerateUnaryKernel(UnaryKernelKey key) - { - // UnaryKernel signature: - // void(void* input, void* output, int* strides, int* shape, int ndim, int totalSize) - var dm = new DynamicMethod( - name: $"Unary_{key}", - returnType: typeof(void), - parameterTypes: new[] - { - typeof(void*), typeof(void*), - typeof(int*), typeof(int*), - typeof(int), typeof(int) - }, - owner: typeof(ILKernelGenerator), - skipVisibility: true - ); - - var il = dm.GetILGenerator(); - - int inputSize = GetTypeSize(key.InputType); - int outputSize = GetTypeSize(key.OutputType); - - if (key.IsContiguous) - { - // Check if we can use SIMD for this operation - bool canSimd = CanUseUnarySimd(key); - if (canSimd) - { - EmitUnarySimdLoop(il, key, inputSize, outputSize); - } - else - { - EmitUnaryScalarLoop(il, key, inputSize, outputSize); - } - } - else - { - EmitUnaryStridedLoop(il, key, inputSize, outputSize); - } - - il.Emit(OpCodes.Ret); - return dm.CreateDelegate(); - } - - /// - /// Check if SIMD can be used for this unary operation. - /// - private static bool CanUseUnarySimd(UnaryKernelKey key) - { - // SIMD only for same-type operations on float/double - if (!key.IsSameType) - return false; - - // Only float and double have good SIMD support for unary ops - if (key.InputType != NPTypeCode.Single && key.InputType != NPTypeCode.Double) - return false; - - // Only certain operations have SIMD support - return key.Op == UnaryOp.Negate || key.Op == UnaryOp.Abs || key.Op == UnaryOp.Sqrt; - } - - /// - /// Emit SIMD loop for contiguous unary operations. - /// - private static void EmitUnarySimdLoop(ILGenerator il, UnaryKernelKey key, - int inputSize, int outputSize) - { - int vectorCount = GetVectorCount(key.InputType); - - var locI = il.DeclareLocal(typeof(int)); // loop counter - var locVectorEnd = il.DeclareLocal(typeof(int)); // totalSize - vectorCount - - var lblSimdLoop = il.DefineLabel(); - var lblSimdLoopEnd = il.DefineLabel(); - var lblTailLoop = il.DefineLabel(); - var lblTailLoopEnd = il.DefineLabel(); - - // vectorEnd = totalSize - vectorCount - il.Emit(OpCodes.Ldarg_S, (byte)5); // totalSize - il.Emit(OpCodes.Ldc_I4, vectorCount); - il.Emit(OpCodes.Sub); - il.Emit(OpCodes.Stloc, locVectorEnd); - - // i = 0 - il.Emit(OpCodes.Ldc_I4_0); - il.Emit(OpCodes.Stloc, locI); - - // === SIMD LOOP === - il.MarkLabel(lblSimdLoop); - - // if (i > vectorEnd) goto SimdLoopEnd - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Ldloc, locVectorEnd); - il.Emit(OpCodes.Bgt, lblSimdLoopEnd); - - // Load input vector - il.Emit(OpCodes.Ldarg_0); // input - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4, inputSize); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - EmitVectorLoad(il, key.InputType); - - // Vector operation - EmitUnaryVectorOperation(il, key.Op, key.InputType); - - // Store result vector - il.Emit(OpCodes.Ldarg_1); // output - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4, outputSize); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - EmitVectorStore(il, key.OutputType); - - // i += vectorCount - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Ldc_I4, vectorCount); - il.Emit(OpCodes.Add); - il.Emit(OpCodes.Stloc, locI); - - il.Emit(OpCodes.Br, lblSimdLoop); - il.MarkLabel(lblSimdLoopEnd); - - // === TAIL LOOP === - il.MarkLabel(lblTailLoop); - - // if (i >= totalSize) goto end - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Ldarg_S, (byte)5); // totalSize - il.Emit(OpCodes.Bge, lblTailLoopEnd); - - // output[i] = op(input[i]) - il.Emit(OpCodes.Ldarg_1); // output - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4, outputSize); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - - il.Emit(OpCodes.Ldarg_0); // input - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4, inputSize); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - EmitLoadIndirect(il, key.InputType); - EmitConvertTo(il, key.InputType, key.OutputType); - - EmitUnaryScalarOperation(il, key.Op, key.OutputType); - EmitStoreIndirect(il, key.OutputType); - - // i++ - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Ldc_I4_1); - il.Emit(OpCodes.Add); - il.Emit(OpCodes.Stloc, locI); - - il.Emit(OpCodes.Br, lblTailLoop); - il.MarkLabel(lblTailLoopEnd); - } - - /// - /// Emit scalar loop for contiguous unary operations (no SIMD). - /// - private static void EmitUnaryScalarLoop(ILGenerator il, UnaryKernelKey key, - int inputSize, int outputSize) - { - // Args: void* input (0), void* output (1), - // int* strides (2), int* shape (3), - // int ndim (4), int totalSize (5) - - var locI = il.DeclareLocal(typeof(int)); // loop counter - - var lblLoop = il.DefineLabel(); - var lblLoopEnd = il.DefineLabel(); - - // i = 0 - il.Emit(OpCodes.Ldc_I4_0); - il.Emit(OpCodes.Stloc, locI); - - il.MarkLabel(lblLoop); - - // if (i >= totalSize) goto end - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Ldarg_S, (byte)5); // totalSize - il.Emit(OpCodes.Bge, lblLoopEnd); - - // output[i] = op(input[i]) - // Load output address - il.Emit(OpCodes.Ldarg_1); // output - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4, outputSize); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - - // Load input[i] and convert to output type - il.Emit(OpCodes.Ldarg_0); // input - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4, inputSize); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - EmitLoadIndirect(il, key.InputType); - EmitConvertTo(il, key.InputType, key.OutputType); - - // Perform operation - EmitUnaryScalarOperation(il, key.Op, key.OutputType); - - // Store result - EmitStoreIndirect(il, key.OutputType); - - // i++ - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Ldc_I4_1); - il.Emit(OpCodes.Add); - il.Emit(OpCodes.Stloc, locI); - - il.Emit(OpCodes.Br, lblLoop); - il.MarkLabel(lblLoopEnd); - } - - /// - /// Emit strided loop for non-contiguous unary operations. - /// Uses coordinate-based iteration. - /// - private static void EmitUnaryStridedLoop(ILGenerator il, UnaryKernelKey key, - int inputSize, int outputSize) - { - // Args: void* input (0), void* output (1), - // int* strides (2), int* shape (3), - // int ndim (4), int totalSize (5) - - var locI = il.DeclareLocal(typeof(int)); // linear index - var locD = il.DeclareLocal(typeof(int)); // dimension counter - var locInputOffset = il.DeclareLocal(typeof(int)); // input offset - var locCoord = il.DeclareLocal(typeof(int)); // current coordinate - var locIdx = il.DeclareLocal(typeof(int)); // temp for coordinate calculation - - var lblLoop = il.DefineLabel(); - var lblLoopEnd = il.DefineLabel(); - var lblDimLoop = il.DefineLabel(); - var lblDimLoopEnd = il.DefineLabel(); - - // i = 0 - il.Emit(OpCodes.Ldc_I4_0); - il.Emit(OpCodes.Stloc, locI); - - // Main loop - il.MarkLabel(lblLoop); - - // if (i >= totalSize) goto end - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Ldarg_S, (byte)5); // totalSize - il.Emit(OpCodes.Bge, lblLoopEnd); - - // Calculate inputOffset from linear index - // inputOffset = 0 - il.Emit(OpCodes.Ldc_I4_0); - il.Emit(OpCodes.Stloc, locInputOffset); - - // idx = i (for coordinate calculation) - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Stloc, locIdx); - - // For each dimension (right to left): coord = idx % shape[d], idx /= shape[d] - // d = ndim - 1 - il.Emit(OpCodes.Ldarg_S, (byte)4); // ndim - il.Emit(OpCodes.Ldc_I4_1); - il.Emit(OpCodes.Sub); - il.Emit(OpCodes.Stloc, locD); - - il.MarkLabel(lblDimLoop); - - // if (d < 0) goto DimLoopEnd - il.Emit(OpCodes.Ldloc, locD); - il.Emit(OpCodes.Ldc_I4_0); - il.Emit(OpCodes.Blt, lblDimLoopEnd); - - // coord = idx % shape[d] - il.Emit(OpCodes.Ldloc, locIdx); - il.Emit(OpCodes.Ldarg_3); // shape - il.Emit(OpCodes.Ldloc, locD); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4_4); // sizeof(int) - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - il.Emit(OpCodes.Ldind_I4); - il.Emit(OpCodes.Rem); - il.Emit(OpCodes.Stloc, locCoord); - - // idx /= shape[d] - il.Emit(OpCodes.Ldloc, locIdx); - il.Emit(OpCodes.Ldarg_3); // shape - il.Emit(OpCodes.Ldloc, locD); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4_4); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - il.Emit(OpCodes.Ldind_I4); - il.Emit(OpCodes.Div); - il.Emit(OpCodes.Stloc, locIdx); - - // inputOffset += coord * strides[d] - il.Emit(OpCodes.Ldloc, locInputOffset); - il.Emit(OpCodes.Ldloc, locCoord); - il.Emit(OpCodes.Ldarg_2); // strides - il.Emit(OpCodes.Ldloc, locD); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4_4); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - il.Emit(OpCodes.Ldind_I4); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - il.Emit(OpCodes.Stloc, locInputOffset); - - // d-- - il.Emit(OpCodes.Ldloc, locD); - il.Emit(OpCodes.Ldc_I4_1); - il.Emit(OpCodes.Sub); - il.Emit(OpCodes.Stloc, locD); - - il.Emit(OpCodes.Br, lblDimLoop); - il.MarkLabel(lblDimLoopEnd); - - // Now compute: output[i] = op(input[inputOffset]) - // Load output address (contiguous output) - il.Emit(OpCodes.Ldarg_1); // output - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4, outputSize); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - - // Load input[inputOffset] - il.Emit(OpCodes.Ldarg_0); // input - il.Emit(OpCodes.Ldloc, locInputOffset); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4, inputSize); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - EmitLoadIndirect(il, key.InputType); - EmitConvertTo(il, key.InputType, key.OutputType); - - // Operation - EmitUnaryScalarOperation(il, key.Op, key.OutputType); - - // Store - EmitStoreIndirect(il, key.OutputType); - - // i++ - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Ldc_I4_1); - il.Emit(OpCodes.Add); - il.Emit(OpCodes.Stloc, locI); - - il.Emit(OpCodes.Br, lblLoop); - il.MarkLabel(lblLoopEnd); - } - - /// - /// Emit unary scalar operation. - /// - internal static void EmitUnaryScalarOperation(ILGenerator il, UnaryOp op, NPTypeCode type) - { - // Special handling for decimal - if (type == NPTypeCode.Decimal) - { - EmitUnaryDecimalOperation(il, op); - return; - } - - switch (op) - { - case UnaryOp.Negate: - // For unsigned types, use two's complement: ~val + 1 - // For signed types, use neg opcode - if (IsUnsigned(type)) - { - // ~val + 1 = two's complement negation - il.Emit(OpCodes.Not); - il.Emit(OpCodes.Ldc_I4_1); - // Need to widen to correct type before add - if (type == NPTypeCode.UInt64) - { - il.Emit(OpCodes.Conv_U8); - } - il.Emit(OpCodes.Add); - } - else - { - il.Emit(OpCodes.Neg); - } - break; - - case UnaryOp.Abs: - EmitMathCall(il, "Abs", type); - break; - - case UnaryOp.Sqrt: - EmitMathCall(il, "Sqrt", type); - break; - - case UnaryOp.Exp: - EmitMathCall(il, "Exp", type); - break; - - case UnaryOp.Log: - EmitMathCall(il, "Log", type); - break; - - case UnaryOp.Sin: - EmitMathCall(il, "Sin", type); - break; - - case UnaryOp.Cos: - EmitMathCall(il, "Cos", type); - break; - - case UnaryOp.Tan: - EmitMathCall(il, "Tan", type); - break; - - case UnaryOp.Sinh: - EmitMathCall(il, "Sinh", type); - break; - - case UnaryOp.Cosh: - EmitMathCall(il, "Cosh", type); - break; - - case UnaryOp.Tanh: - EmitMathCall(il, "Tanh", type); - break; - - case UnaryOp.ASin: - EmitMathCall(il, "Asin", type); - break; - - case UnaryOp.ACos: - EmitMathCall(il, "Acos", type); - break; - - case UnaryOp.ATan: - EmitMathCall(il, "Atan", type); - break; - - case UnaryOp.Exp2: - // Use Math.Pow(2, x) since Math.Exp2 may not be available - EmitExp2Call(il, type); - break; - - case UnaryOp.Expm1: - // exp(x) - 1: call Exp then subtract 1 - EmitMathCall(il, "Exp", type); - EmitSubtractOne(il, type); - break; - - case UnaryOp.Log2: - EmitMathCall(il, "Log2", type); - break; - - case UnaryOp.Log10: - EmitMathCall(il, "Log10", type); - break; - - case UnaryOp.Log1p: - // log(1 + x): add 1 then call Log - EmitAddOne(il, type); - EmitMathCall(il, "Log", type); - break; - - case UnaryOp.Sign: - EmitSignCall(il, type); - break; - - case UnaryOp.Ceil: - EmitMathCall(il, "Ceiling", type); - break; - - case UnaryOp.Floor: - EmitMathCall(il, "Floor", type); - break; - - case UnaryOp.Round: - EmitMathCall(il, "Round", type); - break; - - default: - throw new NotSupportedException($"Unary operation {op} not supported"); - } - } - - /// - /// Emit call to Math.X method with appropriate overload. - /// - private static void EmitMathCall(ILGenerator il, string methodName, NPTypeCode type) - { - MethodInfo? method; - - if (type == NPTypeCode.Single) - { - // Use MathF for float - method = typeof(MathF).GetMethod(methodName, new[] { typeof(float) }); - } - else if (type == NPTypeCode.Double) - { - // Use Math for double - method = typeof(Math).GetMethod(methodName, new[] { typeof(double) }); - } - else - { - // For integer types, convert to double, call Math, convert back - // Stack has: value (as output type) - // Need to: conv to double, call Math.X, conv back - - // Convert to double first - EmitConvertToDouble(il, type); - - // Call Math.X(double) - method = typeof(Math).GetMethod(methodName, new[] { typeof(double) }); - il.EmitCall(OpCodes.Call, method!, null); - - // Convert back to target type - EmitConvertFromDouble(il, type); - return; - } - - il.EmitCall(OpCodes.Call, method!, null); - } - - /// - /// Convert stack value to double. - /// - private static void EmitConvertToDouble(ILGenerator il, NPTypeCode from) - { - if (from == NPTypeCode.Double) - return; - - if (IsUnsigned(from)) - il.Emit(OpCodes.Conv_R_Un); - il.Emit(OpCodes.Conv_R8); - } - - /// - /// Convert double on stack to target type. - /// - private static void EmitConvertFromDouble(ILGenerator il, NPTypeCode to) - { - if (to == NPTypeCode.Double) - return; - - switch (to) - { - case NPTypeCode.Boolean: - il.Emit(OpCodes.Ldc_R8, 0.0); - il.Emit(OpCodes.Cgt_Un); - break; - case NPTypeCode.Byte: - il.Emit(OpCodes.Conv_U1); - break; - case NPTypeCode.Int16: - il.Emit(OpCodes.Conv_I2); - break; - case NPTypeCode.UInt16: - case NPTypeCode.Char: - il.Emit(OpCodes.Conv_U2); - break; - case NPTypeCode.Int32: - il.Emit(OpCodes.Conv_I4); - break; - case NPTypeCode.UInt32: - il.Emit(OpCodes.Conv_U4); - break; - case NPTypeCode.Int64: - il.Emit(OpCodes.Conv_I8); - break; - case NPTypeCode.UInt64: - il.Emit(OpCodes.Conv_U8); - break; - case NPTypeCode.Single: - il.Emit(OpCodes.Conv_R4); - break; - default: - throw new NotSupportedException($"Conversion to {to} not supported"); - } - } - - /// - /// Emit 2^x calculation using Math.Pow(2, x). - /// - private static void EmitExp2Call(ILGenerator il, NPTypeCode type) - { - if (type == NPTypeCode.Single) - { - // For float: convert to double, call Pow, convert back - il.Emit(OpCodes.Conv_R8); - il.Emit(OpCodes.Ldc_R8, 2.0); - // Stack: [exponent, base] - but Pow expects (base, exponent) - // Need to swap them - var locExp = il.DeclareLocal(typeof(double)); - il.Emit(OpCodes.Stloc, locExp); // Save exponent - // Now push base then exponent - il.Emit(OpCodes.Ldc_R8, 2.0); - il.Emit(OpCodes.Ldloc, locExp); - il.EmitCall(OpCodes.Call, typeof(Math).GetMethod("Pow", new[] { typeof(double), typeof(double) })!, null); - il.Emit(OpCodes.Conv_R4); - } - else if (type == NPTypeCode.Double) - { - // For double: just call Pow - var locExp = il.DeclareLocal(typeof(double)); - il.Emit(OpCodes.Stloc, locExp); // Save exponent - il.Emit(OpCodes.Ldc_R8, 2.0); - il.Emit(OpCodes.Ldloc, locExp); - il.EmitCall(OpCodes.Call, typeof(Math).GetMethod("Pow", new[] { typeof(double), typeof(double) })!, null); - } - else - { - // For integer types: convert to double, call Pow, convert back - EmitConvertToDouble(il, type); - var locExp = il.DeclareLocal(typeof(double)); - il.Emit(OpCodes.Stloc, locExp); // Save exponent - il.Emit(OpCodes.Ldc_R8, 2.0); - il.Emit(OpCodes.Ldloc, locExp); - il.EmitCall(OpCodes.Call, typeof(Math).GetMethod("Pow", new[] { typeof(double), typeof(double) })!, null); - EmitConvertFromDouble(il, type); - } - } - - /// - /// Emit subtraction of 1 from the value on stack. - /// Used for expm1 = exp(x) - 1. - /// - private static void EmitSubtractOne(ILGenerator il, NPTypeCode type) - { - switch (type) - { - case NPTypeCode.Single: - il.Emit(OpCodes.Ldc_R4, 1.0f); - il.Emit(OpCodes.Sub); - break; - case NPTypeCode.Double: - il.Emit(OpCodes.Ldc_R8, 1.0); - il.Emit(OpCodes.Sub); - break; - default: - // For integer types, value is already double from math call - il.Emit(OpCodes.Ldc_R8, 1.0); - il.Emit(OpCodes.Sub); - break; - } - } - - /// - /// Emit addition of 1 to the value on stack. - /// Used for log1p = log(1 + x). - /// - private static void EmitAddOne(ILGenerator il, NPTypeCode type) - { - // Convert to appropriate float type first, then add 1 - if (type == NPTypeCode.Single) - { - il.Emit(OpCodes.Ldc_R4, 1.0f); - il.Emit(OpCodes.Add); - } - else if (type == NPTypeCode.Double) - { - il.Emit(OpCodes.Ldc_R8, 1.0); - il.Emit(OpCodes.Add); - } - else - { - // For integer types, convert to double first, then add 1 - // The conversion to double will happen in EmitMathCall - EmitConvertToDouble(il, type); - il.Emit(OpCodes.Ldc_R8, 1.0); - il.Emit(OpCodes.Add); - } - } - - /// - /// Emit Math.Sign call with proper type conversion. - /// Math.Sign returns int, so we need to convert back to target type. - /// NumPy: sign(NaN) returns NaN, but .NET Math.Sign throws ArithmeticException. - /// We check for NaN first and return it directly. - /// - private static void EmitSignCall(ILGenerator il, NPTypeCode type) - { - if (type == NPTypeCode.Single) - { - // NumPy: sign(NaN) = NaN. .NET MathF.Sign(NaN) throws. - // Check for NaN first: if (float.IsNaN(x)) return x; else return MathF.Sign(x); - var lblNotNaN = il.DefineLabel(); - var lblEnd = il.DefineLabel(); - - il.Emit(OpCodes.Dup); // duplicate for NaN check - il.EmitCall(OpCodes.Call, typeof(float).GetMethod("IsNaN", new[] { typeof(float) })!, null); - il.Emit(OpCodes.Brfalse, lblNotNaN); - - // Is NaN - value is already on stack, jump to end - il.Emit(OpCodes.Br, lblEnd); - - il.MarkLabel(lblNotNaN); - // Not NaN - call MathF.Sign - var method = typeof(MathF).GetMethod("Sign", new[] { typeof(float) }); - il.EmitCall(OpCodes.Call, method!, null); - il.Emit(OpCodes.Conv_R4); - - il.MarkLabel(lblEnd); - } - else if (type == NPTypeCode.Double) - { - // NumPy: sign(NaN) = NaN. .NET Math.Sign(NaN) throws. - // Check for NaN first: if (double.IsNaN(x)) return x; else return Math.Sign(x); - var lblNotNaN = il.DefineLabel(); - var lblEnd = il.DefineLabel(); - - il.Emit(OpCodes.Dup); // duplicate for NaN check - il.EmitCall(OpCodes.Call, typeof(double).GetMethod("IsNaN", new[] { typeof(double) })!, null); - il.Emit(OpCodes.Brfalse, lblNotNaN); - - // Is NaN - value is already on stack, jump to end - il.Emit(OpCodes.Br, lblEnd); - - il.MarkLabel(lblNotNaN); - // Not NaN - call Math.Sign - var method = typeof(Math).GetMethod("Sign", new[] { typeof(double) }); - il.EmitCall(OpCodes.Call, method!, null); - il.Emit(OpCodes.Conv_R8); - - il.MarkLabel(lblEnd); - } - else if (type == NPTypeCode.Decimal) - { - // Decimal has its own Sign method that returns int - var method = typeof(Math).GetMethod("Sign", new[] { typeof(decimal) }); - il.EmitCall(OpCodes.Call, method!, null); - // Convert int to decimal - il.EmitCall(OpCodes.Call, typeof(decimal).GetMethod("op_Implicit", new[] { typeof(int) })!, null); - } - else - { - // For integer types: convert to double, call Math.Sign, convert back - EmitConvertToDouble(il, type); - var method = typeof(Math).GetMethod("Sign", new[] { typeof(double) }); - il.EmitCall(OpCodes.Call, method!, null); - // Convert int result back to target type - EmitConvertFromInt(il, type); - } - } - - /// - /// Convert int on stack to target type. - /// - private static void EmitConvertFromInt(ILGenerator il, NPTypeCode to) - { - switch (to) - { - case NPTypeCode.Boolean: - il.Emit(OpCodes.Ldc_I4_0); - il.Emit(OpCodes.Cgt_Un); - break; - case NPTypeCode.Byte: - il.Emit(OpCodes.Conv_U1); - break; - case NPTypeCode.Int16: - il.Emit(OpCodes.Conv_I2); - break; - case NPTypeCode.UInt16: - case NPTypeCode.Char: - il.Emit(OpCodes.Conv_U2); - break; - case NPTypeCode.Int32: - // Already int, no conversion needed - break; - case NPTypeCode.UInt32: - il.Emit(OpCodes.Conv_U4); - break; - case NPTypeCode.Int64: - il.Emit(OpCodes.Conv_I8); - break; - case NPTypeCode.UInt64: - il.Emit(OpCodes.Conv_U8); - break; - case NPTypeCode.Single: - il.Emit(OpCodes.Conv_R4); - break; - case NPTypeCode.Double: - il.Emit(OpCodes.Conv_R8); - break; - default: - throw new NotSupportedException($"Conversion from int to {to} not supported"); - } - } - - /// - /// Emit unary operation for decimal type. - /// - private static void EmitUnaryDecimalOperation(ILGenerator il, UnaryOp op) - { - switch (op) - { - case UnaryOp.Negate: - il.EmitCall(OpCodes.Call, - typeof(decimal).GetMethod("op_UnaryNegation", new[] { typeof(decimal) })!, - null); - break; - - case UnaryOp.Abs: - il.EmitCall(OpCodes.Call, - typeof(Math).GetMethod("Abs", new[] { typeof(decimal) })!, - null); - break; - - case UnaryOp.Sign: - // Math.Sign(decimal) returns int, convert back to decimal - il.EmitCall(OpCodes.Call, - typeof(Math).GetMethod("Sign", new[] { typeof(decimal) })!, - null); - il.EmitCall(OpCodes.Call, - typeof(decimal).GetMethod("op_Implicit", new[] { typeof(int) })!, - null); - break; - - case UnaryOp.Ceil: - // Math.Ceiling has decimal overload - il.EmitCall(OpCodes.Call, - typeof(Math).GetMethod("Ceiling", new[] { typeof(decimal) })!, - null); - break; - - case UnaryOp.Floor: - // Math.Floor has decimal overload - il.EmitCall(OpCodes.Call, - typeof(Math).GetMethod("Floor", new[] { typeof(decimal) })!, - null); - break; - - case UnaryOp.Round: - // Math.Round has decimal overload - il.EmitCall(OpCodes.Call, - typeof(Math).GetMethod("Round", new[] { typeof(decimal) })!, - null); - break; - - case UnaryOp.Sqrt: - case UnaryOp.Exp: - case UnaryOp.Log: - case UnaryOp.Sin: - case UnaryOp.Cos: - case UnaryOp.Tan: - case UnaryOp.Sinh: - case UnaryOp.Cosh: - case UnaryOp.Tanh: - case UnaryOp.ASin: - case UnaryOp.ACos: - case UnaryOp.ATan: - case UnaryOp.Log2: - case UnaryOp.Log10: - // Convert to double, perform operation, convert back - il.EmitCall(OpCodes.Call, - typeof(decimal).GetMethod("ToDouble", new[] { typeof(decimal) })!, - null); - - string mathMethod = op switch - { - UnaryOp.Sqrt => "Sqrt", - UnaryOp.Exp => "Exp", - UnaryOp.Log => "Log", - UnaryOp.Sin => "Sin", - UnaryOp.Cos => "Cos", - UnaryOp.Tan => "Tan", - UnaryOp.Sinh => "Sinh", - UnaryOp.Cosh => "Cosh", - UnaryOp.Tanh => "Tanh", - UnaryOp.ASin => "Asin", - UnaryOp.ACos => "Acos", - UnaryOp.ATan => "Atan", - UnaryOp.Log2 => "Log2", - UnaryOp.Log10 => "Log10", - _ => throw new NotSupportedException() - }; - - il.EmitCall(OpCodes.Call, - typeof(Math).GetMethod(mathMethod, new[] { typeof(double) })!, - null); - - il.EmitCall(OpCodes.Call, - typeof(decimal).GetMethod("op_Explicit", new[] { typeof(double) })!, - null); - break; - - case UnaryOp.Exp2: - // 2^x for decimal: convert to double, use Math.Pow, convert back - il.EmitCall(OpCodes.Call, - typeof(decimal).GetMethod("ToDouble", new[] { typeof(decimal) })!, - null); - // Stack: [exponent (double)] - need to call Pow(2, exponent) - var locExpDec = il.DeclareLocal(typeof(double)); - il.Emit(OpCodes.Stloc, locExpDec); - il.Emit(OpCodes.Ldc_R8, 2.0); - il.Emit(OpCodes.Ldloc, locExpDec); - il.EmitCall(OpCodes.Call, - typeof(Math).GetMethod("Pow", new[] { typeof(double), typeof(double) })!, - null); - il.EmitCall(OpCodes.Call, - typeof(decimal).GetMethod("op_Explicit", new[] { typeof(double) })!, - null); - break; - - case UnaryOp.Expm1: - // exp(x) - 1 for decimal - il.EmitCall(OpCodes.Call, - typeof(decimal).GetMethod("ToDouble", new[] { typeof(decimal) })!, - null); - il.EmitCall(OpCodes.Call, - typeof(Math).GetMethod("Exp", new[] { typeof(double) })!, - null); - il.Emit(OpCodes.Ldc_R8, 1.0); - il.Emit(OpCodes.Sub); - il.EmitCall(OpCodes.Call, - typeof(decimal).GetMethod("op_Explicit", new[] { typeof(double) })!, - null); - break; - - case UnaryOp.Log1p: - // log(1 + x) for decimal - il.EmitCall(OpCodes.Call, - typeof(decimal).GetMethod("ToDouble", new[] { typeof(decimal) })!, - null); - il.Emit(OpCodes.Ldc_R8, 1.0); - il.Emit(OpCodes.Add); - il.EmitCall(OpCodes.Call, - typeof(Math).GetMethod("Log", new[] { typeof(double) })!, - null); - il.EmitCall(OpCodes.Call, - typeof(decimal).GetMethod("op_Explicit", new[] { typeof(double) })!, - null); - break; - - default: - throw new NotSupportedException($"Unary operation {op} not supported for decimal"); - } - } - - /// - /// Emit Vector256 unary operation. - /// - private static void EmitUnaryVectorOperation(ILGenerator il, UnaryOp op, NPTypeCode type) - { - var clrType = GetClrType(type); - var vectorType = typeof(Vector256<>).MakeGenericType(clrType); - - string methodName = op switch - { - UnaryOp.Negate => "op_UnaryNegation", - UnaryOp.Abs => "Abs", - UnaryOp.Sqrt => "Sqrt", - _ => throw new NotSupportedException($"SIMD operation {op} not supported") - }; - - MethodInfo? method; - - if (op == UnaryOp.Negate) - { - // Negation is an operator on Vector256 - method = vectorType.GetMethod(methodName, BindingFlags.Public | BindingFlags.Static, - null, new[] { vectorType }, null); - } - else - { - // Abs and Sqrt are static methods on Vector256 - method = typeof(Vector256).GetMethods(BindingFlags.Public | BindingFlags.Static) - .Where(m => m.Name == methodName && m.IsGenericMethod && m.GetParameters().Length == 1) - .Select(m => m.MakeGenericMethod(clrType)) - .FirstOrDefault(m => m.GetParameters()[0].ParameterType == vectorType); - } - - if (method == null) - throw new InvalidOperationException($"Could not find {methodName} for Vector256<{type}>"); - - il.EmitCall(OpCodes.Call, method, null); - } - - #endregion - - #region Scalar Kernel Generation - - /// - /// Cache for unary scalar kernels. - /// Key: UnaryScalarKernelKey (InputType, OutputType, Op) - /// Value: Delegate (Func<TInput, TOutput>) - /// - private static readonly ConcurrentDictionary _unaryScalarCache = new(); - - /// - /// Cache for binary scalar kernels. - /// Key: BinaryScalarKernelKey (LhsType, RhsType, ResultType, Op) - /// Value: Delegate (Func<TLhs, TRhs, TResult>) - /// - private static readonly ConcurrentDictionary _binaryScalarCache = new(); - - /// - /// Number of unary scalar kernels in cache. - /// - public static int UnaryScalarCachedCount => _unaryScalarCache.Count; - - /// - /// Number of binary scalar kernels in cache. - /// - public static int BinaryScalarCachedCount => _binaryScalarCache.Count; - - /// - /// Clear the scalar kernel caches. - /// - public static void ClearScalar() - { - _unaryScalarCache.Clear(); - _binaryScalarCache.Clear(); - } - - /// - /// Get or generate an IL-based unary scalar delegate. - /// Returns a Func<TInput, TOutput> delegate. - /// - public static Delegate GetUnaryScalarDelegate(UnaryScalarKernelKey key) - { - if (!Enabled) - throw new InvalidOperationException("IL generation is disabled"); - - return _unaryScalarCache.GetOrAdd(key, GenerateUnaryScalarDelegate); - } - - /// - /// Get or generate an IL-based binary scalar delegate. - /// Returns a Func<TLhs, TRhs, TResult> delegate. - /// - public static Delegate GetBinaryScalarDelegate(BinaryScalarKernelKey key) - { - if (!Enabled) - throw new InvalidOperationException("IL generation is disabled"); - - return _binaryScalarCache.GetOrAdd(key, GenerateBinaryScalarDelegate); - } - - /// - /// Generate an IL-based unary scalar delegate. - /// Creates a Func<TInput, TOutput> that performs the operation. - /// - private static Delegate GenerateUnaryScalarDelegate(UnaryScalarKernelKey key) - { - var inputClr = GetClrType(key.InputType); - var outputClr = GetClrType(key.OutputType); - - // Create DynamicMethod: TOutput Method(TInput input) - var dm = new DynamicMethod( - name: $"ScalarUnary_{key}", - returnType: outputClr, - parameterTypes: new[] { inputClr }, - owner: typeof(ILKernelGenerator), - skipVisibility: true - ); - - var il = dm.GetILGenerator(); - - // Load input argument - il.Emit(OpCodes.Ldarg_0); - - // Convert to output type if different - EmitConvertTo(il, key.InputType, key.OutputType); - - // Perform the unary operation (result is on stack) - EmitUnaryScalarOperation(il, key.Op, key.OutputType); - - // Return - il.Emit(OpCodes.Ret); - - // Create typed Func - var funcType = typeof(Func<,>).MakeGenericType(inputClr, outputClr); - return dm.CreateDelegate(funcType); - } - - /// - /// Generate an IL-based binary scalar delegate. - /// Creates a Func<TLhs, TRhs, TResult> that performs the operation. - /// - private static Delegate GenerateBinaryScalarDelegate(BinaryScalarKernelKey key) - { - var lhsClr = GetClrType(key.LhsType); - var rhsClr = GetClrType(key.RhsType); - var resultClr = GetClrType(key.ResultType); - - // Create DynamicMethod: TResult Method(TLhs lhs, TRhs rhs) - var dm = new DynamicMethod( - name: $"ScalarBinary_{key}", - returnType: resultClr, - parameterTypes: new[] { lhsClr, rhsClr }, - owner: typeof(ILKernelGenerator), - skipVisibility: true - ); - - var il = dm.GetILGenerator(); - - // Load lhs, convert to result type - il.Emit(OpCodes.Ldarg_0); - EmitConvertTo(il, key.LhsType, key.ResultType); - - // Load rhs, convert to result type - il.Emit(OpCodes.Ldarg_1); - EmitConvertTo(il, key.RhsType, key.ResultType); - - // Perform binary operation - EmitScalarOperation(il, key.Op, key.ResultType); - - // Return - il.Emit(OpCodes.Ret); - - // Create typed Func - var funcType = typeof(Func<,,>).MakeGenericType(lhsClr, rhsClr, resultClr); - return dm.CreateDelegate(funcType); - } - - #endregion - - #region Comparison Kernel Generation - - /// - /// Cache for comparison kernels. - /// Key: ComparisonKernelKey (LhsType, RhsType, Op, Path) - /// - private static readonly ConcurrentDictionary _comparisonCache = new(); - - /// - /// Number of comparison kernels in cache. - /// - public static int ComparisonCachedCount => _comparisonCache.Count; - - /// - /// Clear the comparison kernel cache. - /// - public static void ClearComparison() => _comparisonCache.Clear(); - - /// - /// Get or generate a comparison kernel for the specified key. - /// - public static ComparisonKernel GetComparisonKernel(ComparisonKernelKey key) - { - if (!Enabled) - throw new InvalidOperationException("IL generation is disabled"); - - return _comparisonCache.GetOrAdd(key, GenerateComparisonKernel); - } - - /// - /// Try to get or generate a comparison kernel. Returns null if generation fails. - /// - public static ComparisonKernel? TryGetComparisonKernel(ComparisonKernelKey key) - { - if (!Enabled) - return null; - - try - { - return _comparisonCache.GetOrAdd(key, GenerateComparisonKernel); - } - catch - { - return null; - } - } - - /// - /// Generate a comparison kernel for the specified key. - /// - private static ComparisonKernel GenerateComparisonKernel(ComparisonKernelKey key) - { - return key.Path switch - { - ExecutionPath.SimdFull => GenerateComparisonSimdFullKernel(key), - ExecutionPath.SimdScalarRight => GenerateComparisonScalarRightKernel(key), - ExecutionPath.SimdScalarLeft => GenerateComparisonScalarLeftKernel(key), - ExecutionPath.SimdChunk => GenerateComparisonGeneralKernel(key), // Fall through to general - ExecutionPath.General => GenerateComparisonGeneralKernel(key), - _ => throw new NotSupportedException($"Path {key.Path} not supported") - }; - } - - /// - /// Generate a comparison kernel for contiguous arrays. - /// - private static ComparisonKernel GenerateComparisonSimdFullKernel(ComparisonKernelKey key) - { - // ComparisonKernel signature: - // void(void* lhs, void* rhs, bool* result, int* lhsStrides, int* rhsStrides, int* shape, int ndim, int totalSize) - var dm = new DynamicMethod( - name: $"Comparison_SimdFull_{key}", - returnType: typeof(void), - parameterTypes: new[] - { - typeof(void*), typeof(void*), typeof(bool*), - typeof(int*), typeof(int*), typeof(int*), - typeof(int), typeof(int) - }, - owner: typeof(ILKernelGenerator), - skipVisibility: true - ); - - var il = dm.GetILGenerator(); - - int lhsSize = GetTypeSize(key.LhsType); - int rhsSize = GetTypeSize(key.RhsType); - var comparisonType = key.ComparisonType; - - EmitComparisonScalarLoop(il, key, lhsSize, rhsSize, comparisonType); - - il.Emit(OpCodes.Ret); - return dm.CreateDelegate(); - } - - /// - /// Generate a comparison kernel for scalar right operand. - /// - private static ComparisonKernel GenerateComparisonScalarRightKernel(ComparisonKernelKey key) - { - var dm = new DynamicMethod( - name: $"Comparison_ScalarRight_{key}", - returnType: typeof(void), - parameterTypes: new[] - { - typeof(void*), typeof(void*), typeof(bool*), - typeof(int*), typeof(int*), typeof(int*), - typeof(int), typeof(int) - }, - owner: typeof(ILKernelGenerator), - skipVisibility: true - ); - - var il = dm.GetILGenerator(); - - int lhsSize = GetTypeSize(key.LhsType); - int rhsSize = GetTypeSize(key.RhsType); - var comparisonType = key.ComparisonType; - - EmitComparisonScalarRightLoop(il, key, lhsSize, rhsSize, comparisonType); - - il.Emit(OpCodes.Ret); - return dm.CreateDelegate(); - } - - /// - /// Generate a comparison kernel for scalar left operand. - /// - private static ComparisonKernel GenerateComparisonScalarLeftKernel(ComparisonKernelKey key) - { - var dm = new DynamicMethod( - name: $"Comparison_ScalarLeft_{key}", - returnType: typeof(void), - parameterTypes: new[] - { - typeof(void*), typeof(void*), typeof(bool*), - typeof(int*), typeof(int*), typeof(int*), - typeof(int), typeof(int) - }, - owner: typeof(ILKernelGenerator), - skipVisibility: true - ); - - var il = dm.GetILGenerator(); - - int lhsSize = GetTypeSize(key.LhsType); - int rhsSize = GetTypeSize(key.RhsType); - var comparisonType = key.ComparisonType; - - EmitComparisonScalarLeftLoop(il, key, lhsSize, rhsSize, comparisonType); - - il.Emit(OpCodes.Ret); - return dm.CreateDelegate(); - } - - /// - /// Generate a general comparison kernel for arbitrary strides. - /// - private static ComparisonKernel GenerateComparisonGeneralKernel(ComparisonKernelKey key) - { - var dm = new DynamicMethod( - name: $"Comparison_General_{key}", - returnType: typeof(void), - parameterTypes: new[] - { - typeof(void*), typeof(void*), typeof(bool*), - typeof(int*), typeof(int*), typeof(int*), - typeof(int), typeof(int) - }, - owner: typeof(ILKernelGenerator), - skipVisibility: true - ); - - var il = dm.GetILGenerator(); - - int lhsSize = GetTypeSize(key.LhsType); - int rhsSize = GetTypeSize(key.RhsType); - var comparisonType = key.ComparisonType; - - EmitComparisonGeneralLoop(il, key, lhsSize, rhsSize, comparisonType); - - il.Emit(OpCodes.Ret); - return dm.CreateDelegate(); - } - - #region Comparison Loop Emission - - /// - /// Emit a scalar loop for contiguous comparison. - /// - private static void EmitComparisonScalarLoop(ILGenerator il, ComparisonKernelKey key, - int lhsSize, int rhsSize, NPTypeCode comparisonType) - { - // Args: void* lhs (0), void* rhs (1), bool* result (2), - // int* lhsStrides (3), int* rhsStrides (4), int* shape (5), - // int ndim (6), int totalSize (7) - - var locI = il.DeclareLocal(typeof(int)); // loop counter - - var lblLoop = il.DefineLabel(); - var lblLoopEnd = il.DefineLabel(); - - // i = 0 - il.Emit(OpCodes.Ldc_I4_0); - il.Emit(OpCodes.Stloc, locI); - - il.MarkLabel(lblLoop); - - // if (i >= totalSize) goto end - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize - il.Emit(OpCodes.Bge, lblLoopEnd); - - // result[i] = (lhs[i] op rhs[i]) - // Load result address - il.Emit(OpCodes.Ldarg_2); // result (bool*) - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Add); // bool is 1 byte, so just add i - - // Load lhs[i] and convert to comparison type - il.Emit(OpCodes.Ldarg_0); // lhs - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4, lhsSize); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - EmitLoadIndirect(il, key.LhsType); - EmitConvertTo(il, key.LhsType, comparisonType); - - // Load rhs[i] and convert to comparison type - il.Emit(OpCodes.Ldarg_1); // rhs - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4, rhsSize); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - EmitLoadIndirect(il, key.RhsType); - EmitConvertTo(il, key.RhsType, comparisonType); - - // Perform comparison - EmitComparisonOperation(il, key.Op, comparisonType); - - // Store bool result - il.Emit(OpCodes.Stind_I1); - - // i++ - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Ldc_I4_1); - il.Emit(OpCodes.Add); - il.Emit(OpCodes.Stloc, locI); - - il.Emit(OpCodes.Br, lblLoop); - il.MarkLabel(lblLoopEnd); - } - - /// - /// Emit loop for scalar right operand comparison. - /// - private static void EmitComparisonScalarRightLoop(ILGenerator il, ComparisonKernelKey key, - int lhsSize, int rhsSize, NPTypeCode comparisonType) - { - var locI = il.DeclareLocal(typeof(int)); // loop counter - var locRhsVal = il.DeclareLocal(GetClrType(comparisonType)); // scalar value - - var lblLoop = il.DefineLabel(); - var lblLoopEnd = il.DefineLabel(); - - // Load rhs[0] and convert to comparison type, store in local - il.Emit(OpCodes.Ldarg_1); // rhs - EmitLoadIndirect(il, key.RhsType); - EmitConvertTo(il, key.RhsType, comparisonType); - il.Emit(OpCodes.Stloc, locRhsVal); - - // i = 0 - il.Emit(OpCodes.Ldc_I4_0); - il.Emit(OpCodes.Stloc, locI); - - il.MarkLabel(lblLoop); - - // if (i >= totalSize) goto end - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize - il.Emit(OpCodes.Bge, lblLoopEnd); - - // result[i] = (lhs[i] op rhsVal) - il.Emit(OpCodes.Ldarg_2); // result - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Add); - - // Load lhs[i] and convert - il.Emit(OpCodes.Ldarg_0); // lhs - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4, lhsSize); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - EmitLoadIndirect(il, key.LhsType); - EmitConvertTo(il, key.LhsType, comparisonType); - - // Load cached rhs scalar - il.Emit(OpCodes.Ldloc, locRhsVal); - - EmitComparisonOperation(il, key.Op, comparisonType); - il.Emit(OpCodes.Stind_I1); - - // i++ - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Ldc_I4_1); - il.Emit(OpCodes.Add); - il.Emit(OpCodes.Stloc, locI); - - il.Emit(OpCodes.Br, lblLoop); - il.MarkLabel(lblLoopEnd); - } - - /// - /// Emit loop for scalar left operand comparison. - /// - private static void EmitComparisonScalarLeftLoop(ILGenerator il, ComparisonKernelKey key, - int lhsSize, int rhsSize, NPTypeCode comparisonType) - { - var locI = il.DeclareLocal(typeof(int)); // loop counter - var locLhsVal = il.DeclareLocal(GetClrType(comparisonType)); // scalar value - - var lblLoop = il.DefineLabel(); - var lblLoopEnd = il.DefineLabel(); - - // Load lhs[0] and convert to comparison type, store in local - il.Emit(OpCodes.Ldarg_0); // lhs - EmitLoadIndirect(il, key.LhsType); - EmitConvertTo(il, key.LhsType, comparisonType); - il.Emit(OpCodes.Stloc, locLhsVal); - - // i = 0 - il.Emit(OpCodes.Ldc_I4_0); - il.Emit(OpCodes.Stloc, locI); - - il.MarkLabel(lblLoop); - - // if (i >= totalSize) goto end - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize - il.Emit(OpCodes.Bge, lblLoopEnd); - - // result[i] = (lhsVal op rhs[i]) - il.Emit(OpCodes.Ldarg_2); // result - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Add); - - // Load cached lhs scalar - il.Emit(OpCodes.Ldloc, locLhsVal); - - // Load rhs[i] and convert - il.Emit(OpCodes.Ldarg_1); // rhs - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4, rhsSize); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - EmitLoadIndirect(il, key.RhsType); - EmitConvertTo(il, key.RhsType, comparisonType); - - EmitComparisonOperation(il, key.Op, comparisonType); - il.Emit(OpCodes.Stind_I1); - - // i++ - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Ldc_I4_1); - il.Emit(OpCodes.Add); - il.Emit(OpCodes.Stloc, locI); - - il.Emit(OpCodes.Br, lblLoop); - il.MarkLabel(lblLoopEnd); - } - - /// - /// Emit general coordinate-based iteration loop for comparison. - /// - private static void EmitComparisonGeneralLoop(ILGenerator il, ComparisonKernelKey key, - int lhsSize, int rhsSize, NPTypeCode comparisonType) - { - // Args: void* lhs (0), void* rhs (1), bool* result (2), - // int* lhsStrides (3), int* rhsStrides (4), int* shape (5), - // int ndim (6), int totalSize (7) - - var locI = il.DeclareLocal(typeof(int)); // linear index - var locD = il.DeclareLocal(typeof(int)); // dimension counter - var locLhsOffset = il.DeclareLocal(typeof(int)); // lhs offset - var locRhsOffset = il.DeclareLocal(typeof(int)); // rhs offset - var locCoord = il.DeclareLocal(typeof(int)); // current coordinate - var locIdx = il.DeclareLocal(typeof(int)); // temp for coordinate calculation - - var lblLoop = il.DefineLabel(); - var lblLoopEnd = il.DefineLabel(); - var lblDimLoop = il.DefineLabel(); - var lblDimLoopEnd = il.DefineLabel(); - - // i = 0 - il.Emit(OpCodes.Ldc_I4_0); - il.Emit(OpCodes.Stloc, locI); - - // Main loop - il.MarkLabel(lblLoop); - - // if (i >= totalSize) goto end - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize - il.Emit(OpCodes.Bge, lblLoopEnd); - - // Calculate lhsOffset and rhsOffset from linear index - il.Emit(OpCodes.Ldc_I4_0); - il.Emit(OpCodes.Stloc, locLhsOffset); - il.Emit(OpCodes.Ldc_I4_0); - il.Emit(OpCodes.Stloc, locRhsOffset); - - // idx = i (for coordinate calculation) - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Stloc, locIdx); - - // d = ndim - 1 - il.Emit(OpCodes.Ldarg_S, (byte)6); // ndim - il.Emit(OpCodes.Ldc_I4_1); - il.Emit(OpCodes.Sub); - il.Emit(OpCodes.Stloc, locD); - - il.MarkLabel(lblDimLoop); - - // if (d < 0) goto DimLoopEnd - il.Emit(OpCodes.Ldloc, locD); - il.Emit(OpCodes.Ldc_I4_0); - il.Emit(OpCodes.Blt, lblDimLoopEnd); - - // coord = idx % shape[d] - il.Emit(OpCodes.Ldloc, locIdx); - il.Emit(OpCodes.Ldarg_S, (byte)5); // shape - il.Emit(OpCodes.Ldloc, locD); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4_4); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - il.Emit(OpCodes.Ldind_I4); - il.Emit(OpCodes.Rem); - il.Emit(OpCodes.Stloc, locCoord); - - // idx /= shape[d] - il.Emit(OpCodes.Ldloc, locIdx); - il.Emit(OpCodes.Ldarg_S, (byte)5); // shape - il.Emit(OpCodes.Ldloc, locD); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4_4); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - il.Emit(OpCodes.Ldind_I4); - il.Emit(OpCodes.Div); - il.Emit(OpCodes.Stloc, locIdx); - - // lhsOffset += coord * lhsStrides[d] - il.Emit(OpCodes.Ldloc, locLhsOffset); - il.Emit(OpCodes.Ldloc, locCoord); - il.Emit(OpCodes.Ldarg_3); // lhsStrides - il.Emit(OpCodes.Ldloc, locD); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4_4); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - il.Emit(OpCodes.Ldind_I4); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - il.Emit(OpCodes.Stloc, locLhsOffset); - - // rhsOffset += coord * rhsStrides[d] - il.Emit(OpCodes.Ldloc, locRhsOffset); - il.Emit(OpCodes.Ldloc, locCoord); - il.Emit(OpCodes.Ldarg_S, (byte)4); // rhsStrides - il.Emit(OpCodes.Ldloc, locD); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4_4); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - il.Emit(OpCodes.Ldind_I4); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - il.Emit(OpCodes.Stloc, locRhsOffset); - - // d-- - il.Emit(OpCodes.Ldloc, locD); - il.Emit(OpCodes.Ldc_I4_1); - il.Emit(OpCodes.Sub); - il.Emit(OpCodes.Stloc, locD); - - il.Emit(OpCodes.Br, lblDimLoop); - il.MarkLabel(lblDimLoopEnd); - - // result[i] = (lhs[lhsOffset] op rhs[rhsOffset]) - // Load result address (contiguous output) - il.Emit(OpCodes.Ldarg_2); // result - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Add); - - // Load lhs[lhsOffset] - il.Emit(OpCodes.Ldarg_0); // lhs - il.Emit(OpCodes.Ldloc, locLhsOffset); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4, lhsSize); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - EmitLoadIndirect(il, key.LhsType); - EmitConvertTo(il, key.LhsType, comparisonType); - - // Load rhs[rhsOffset] - il.Emit(OpCodes.Ldarg_1); // rhs - il.Emit(OpCodes.Ldloc, locRhsOffset); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4, rhsSize); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - EmitLoadIndirect(il, key.RhsType); - EmitConvertTo(il, key.RhsType, comparisonType); - - // Comparison - EmitComparisonOperation(il, key.Op, comparisonType); - - // Store bool - il.Emit(OpCodes.Stind_I1); - - // i++ - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Ldc_I4_1); - il.Emit(OpCodes.Add); - il.Emit(OpCodes.Stloc, locI); - - il.Emit(OpCodes.Br, lblLoop); - il.MarkLabel(lblLoopEnd); - } - - #endregion - - #region Comparison Operation Emission - - /// - /// Emit comparison operation. Stack has two values of comparisonType, result is bool (0 or 1). - /// - internal static void EmitComparisonOperation(ILGenerator il, ComparisonOp op, NPTypeCode comparisonType) - { - // Special handling for decimal comparisons - if (comparisonType == NPTypeCode.Decimal) - { - EmitDecimalComparison(il, op); - return; - } - - bool isUnsigned = IsUnsigned(comparisonType); - bool isFloat = comparisonType == NPTypeCode.Single || comparisonType == NPTypeCode.Double; - - switch (op) - { - case ComparisonOp.Equal: - il.Emit(OpCodes.Ceq); - break; - - case ComparisonOp.NotEqual: - il.Emit(OpCodes.Ceq); - // Negate: result = !result (xor with 1) - il.Emit(OpCodes.Ldc_I4_0); - il.Emit(OpCodes.Ceq); - break; - - case ComparisonOp.Less: - if (isUnsigned) - il.Emit(OpCodes.Clt_Un); - else - il.Emit(OpCodes.Clt); - break; - - case ComparisonOp.LessEqual: - // a <= b is !(a > b) - if (isUnsigned) - il.Emit(OpCodes.Cgt_Un); - else - il.Emit(OpCodes.Cgt); - // Negate - il.Emit(OpCodes.Ldc_I4_0); - il.Emit(OpCodes.Ceq); - break; - - case ComparisonOp.Greater: - if (isUnsigned) - il.Emit(OpCodes.Cgt_Un); - else - il.Emit(OpCodes.Cgt); - break; - - case ComparisonOp.GreaterEqual: - // a >= b is !(a < b) - if (isUnsigned) - il.Emit(OpCodes.Clt_Un); - else - il.Emit(OpCodes.Clt); - // Negate - il.Emit(OpCodes.Ldc_I4_0); - il.Emit(OpCodes.Ceq); - break; - - default: - throw new NotSupportedException($"Comparison operation {op} not supported"); - } - } - - /// - /// Emit decimal comparison using operator methods. - /// - private static void EmitDecimalComparison(ILGenerator il, ComparisonOp op) - { - // decimal has comparison operators that return bool - string methodName = op switch - { - ComparisonOp.Equal => "op_Equality", - ComparisonOp.NotEqual => "op_Inequality", - ComparisonOp.Less => "op_LessThan", - ComparisonOp.LessEqual => "op_LessThanOrEqual", - ComparisonOp.Greater => "op_GreaterThan", - ComparisonOp.GreaterEqual => "op_GreaterThanOrEqual", - _ => throw new NotSupportedException($"Comparison {op} not supported for decimal") - }; - - var method = typeof(decimal).GetMethod( - methodName, - BindingFlags.Public | BindingFlags.Static, - null, - new[] { typeof(decimal), typeof(decimal) }, - null - ); - - il.EmitCall(OpCodes.Call, method!, null); - } - - #endregion - - #region Comparison Scalar Kernel Generation - - /// - /// Cache key for comparison scalar operation kernels. - /// - public readonly record struct ComparisonScalarKernelKey( - NPTypeCode LhsType, - NPTypeCode RhsType, - ComparisonOp Op - ) - { - public NPTypeCode ComparisonType => np._FindCommonScalarType(LhsType, RhsType); - public override string ToString() => $"ScalarCmp_{Op}_{LhsType}_{RhsType}"; - } - - /// - /// Cache for comparison scalar kernels. - /// - private static readonly ConcurrentDictionary _comparisonScalarCache = new(); - - /// - /// Number of comparison scalar kernels in cache. - /// - public static int ComparisonScalarCachedCount => _comparisonScalarCache.Count; - - /// - /// Get or generate a comparison scalar delegate. - /// Returns a Func<TLhs, TRhs, bool> delegate. - /// - public static Delegate GetComparisonScalarDelegate(ComparisonScalarKernelKey key) - { - if (!Enabled) - throw new InvalidOperationException("IL generation is disabled"); - - return _comparisonScalarCache.GetOrAdd(key, GenerateComparisonScalarDelegate); - } - - /// - /// Generate an IL-based comparison scalar delegate. - /// - private static Delegate GenerateComparisonScalarDelegate(ComparisonScalarKernelKey key) - { - var lhsClr = GetClrType(key.LhsType); - var rhsClr = GetClrType(key.RhsType); - var comparisonType = key.ComparisonType; - - // Create DynamicMethod: bool Method(TLhs lhs, TRhs rhs) - var dm = new DynamicMethod( - name: $"ScalarComparison_{key}", - returnType: typeof(bool), - parameterTypes: new[] { lhsClr, rhsClr }, - owner: typeof(ILKernelGenerator), - skipVisibility: true - ); - - var il = dm.GetILGenerator(); - - // Load lhs, convert to comparison type - il.Emit(OpCodes.Ldarg_0); - EmitConvertTo(il, key.LhsType, comparisonType); - - // Load rhs, convert to comparison type - il.Emit(OpCodes.Ldarg_1); - EmitConvertTo(il, key.RhsType, comparisonType); - - // Perform comparison - EmitComparisonOperation(il, key.Op, comparisonType); - - // Return - il.Emit(OpCodes.Ret); - - // Create typed Func - var funcType = typeof(Func<,,>).MakeGenericType(lhsClr, rhsClr, typeof(bool)); - return dm.CreateDelegate(funcType); - } - - #endregion - - #endregion - - #region Reduction Kernel Generation - - /// - /// Cache for element-wise reduction kernels. - /// Key: ElementReductionKernelKey + /// Whether IL generation is enabled. Can be disabled for debugging. /// - private static readonly ConcurrentDictionary _elementReductionCache = new(); + public static bool Enabled { get; set; } = true; /// - /// Number of element reduction kernels in cache. + /// Detected vector width at startup: 512, 256, 128, or 0 (no SIMD). /// - public static int ElementReductionCachedCount => _elementReductionCache.Count; + public static readonly int VectorBits = + Vector512.IsHardwareAccelerated ? 512 : + Vector256.IsHardwareAccelerated ? 256 : + Vector128.IsHardwareAccelerated ? 128 : 0; /// - /// Clear the reduction kernel caches. + /// Number of bytes per vector register. /// - public static void ClearReduction() - { - _elementReductionCache.Clear(); - } + public static readonly int VectorBytes = VectorBits / 8; /// - /// Get or generate a typed element-wise reduction kernel. - /// Returns a delegate that reduces all elements to a single value of type TResult. + /// Get the Vector container type (Vector128, Vector256, or Vector512). /// - public static TypedElementReductionKernel GetTypedElementReductionKernel(ElementReductionKernelKey key) - where TResult : unmanaged + internal static Type GetVectorContainerType() => VectorBits switch { - if (!Enabled) - throw new InvalidOperationException("IL generation is disabled"); - - var kernel = _elementReductionCache.GetOrAdd(key, GenerateTypedElementReductionKernel); - return (TypedElementReductionKernel)kernel; - } + 512 => typeof(Vector512), + 256 => typeof(Vector256), + 128 => typeof(Vector128), + _ => throw new NotSupportedException("No SIMD support") + }; /// - /// Try to get or generate an element reduction kernel. + /// Get the Vector{Width}<T> generic type. /// - public static TypedElementReductionKernel? TryGetTypedElementReductionKernel(ElementReductionKernelKey key) - where TResult : unmanaged + internal static Type GetVectorType(Type elementType) => VectorBits switch { - if (!Enabled) - return null; + 512 => typeof(Vector512<>).MakeGenericType(elementType), + 256 => typeof(Vector256<>).MakeGenericType(elementType), + 128 => typeof(Vector128<>).MakeGenericType(elementType), + _ => throw new NotSupportedException("No SIMD support") + }; - try - { - var kernel = _elementReductionCache.GetOrAdd(key, GenerateTypedElementReductionKernel); - return (TypedElementReductionKernel)kernel; - } - catch - { - return null; - } - } + #region NPTypeCode-Based IL Helpers /// - /// Generate a typed element-wise reduction kernel. + /// Get size in bytes for NPTypeCode. /// - private static Delegate GenerateTypedElementReductionKernel(ElementReductionKernelKey key) - where TResult : unmanaged + internal static int GetTypeSize(NPTypeCode type) { - // TypedElementReductionKernel signature: - // TResult(void* input, int* strides, int* shape, int ndim, int totalSize) - var dm = new DynamicMethod( - name: $"ElemReduce_{key}", - returnType: typeof(TResult), - parameterTypes: new[] - { - typeof(void*), typeof(int*), typeof(int*), typeof(int), typeof(int) - }, - owner: typeof(ILKernelGenerator), - skipVisibility: true - ); - - var il = dm.GetILGenerator(); - - int inputSize = GetTypeSize(key.InputType); - int accumSize = GetTypeSize(key.AccumulatorType); - - if (key.IsContiguous) - { - // Check if we can use SIMD - bool canSimd = CanUseReductionSimd(key); - if (canSimd) - { - EmitReductionSimdLoop(il, key, inputSize); - } - else - { - EmitReductionScalarLoop(il, key, inputSize); - } - } - else + return type switch { - EmitReductionStridedLoop(il, key, inputSize); - } - - il.Emit(OpCodes.Ret); - return dm.CreateDelegate>(); - } - - /// - /// Check if SIMD can be used for this reduction operation. - /// - private static bool CanUseReductionSimd(ElementReductionKernelKey key) - { - // Must be contiguous - if (!key.IsContiguous) - return false; - - // SIMD for numeric types (not bool, char, decimal) - if (!CanUseSimd(key.InputType)) - return false; - - // Only certain operations have SIMD support - // Sum: Vector256.Sum() or manual horizontal add - // Max/Min: Reduce vector then scalar reduce remainder - // Prod: No SIMD (no horizontal multiply) - // ArgMax/ArgMin: Need to track indices, more complex - return key.Op == ReductionOp.Sum || key.Op == ReductionOp.Max || key.Op == ReductionOp.Min; - } - - /// - /// Emit a SIMD reduction loop for contiguous arrays. - /// Uses Vector256 for horizontal reductions. - /// - private static void EmitReductionSimdLoop(ILGenerator il, ElementReductionKernelKey key, int inputSize) - { - int vectorCount = GetVectorCount(key.InputType); - - var locI = il.DeclareLocal(typeof(int)); // loop counter - var locVectorEnd = il.DeclareLocal(typeof(int)); // totalSize - vectorCount - var locAccum = il.DeclareLocal(GetClrType(key.AccumulatorType)); // scalar accumulator - - var lblSimdLoop = il.DefineLabel(); - var lblSimdLoopEnd = il.DefineLabel(); - var lblTailLoop = il.DefineLabel(); - var lblTailLoopEnd = il.DefineLabel(); - - // Initialize accumulator with identity value - EmitLoadIdentity(il, key.Op, key.AccumulatorType); - il.Emit(OpCodes.Stloc, locAccum); - - // vectorEnd = totalSize - vectorCount - il.Emit(OpCodes.Ldarg_S, (byte)4); // totalSize - il.Emit(OpCodes.Ldc_I4, vectorCount); - il.Emit(OpCodes.Sub); - il.Emit(OpCodes.Stloc, locVectorEnd); - - // i = 0 - il.Emit(OpCodes.Ldc_I4_0); - il.Emit(OpCodes.Stloc, locI); - - // === SIMD LOOP === - il.MarkLabel(lblSimdLoop); - - // if (i > vectorEnd) goto SimdLoopEnd - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Ldloc, locVectorEnd); - il.Emit(OpCodes.Bgt, lblSimdLoopEnd); - - // Load vector from input[i] - il.Emit(OpCodes.Ldarg_0); // input - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4, inputSize); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - EmitVectorLoad(il, key.InputType); - - // Perform horizontal reduction on vector and combine with accumulator - EmitVectorHorizontalReduction(il, key.Op, key.InputType); - - // Combine with accumulator - il.Emit(OpCodes.Ldloc, locAccum); - EmitReductionCombine(il, key.Op, key.AccumulatorType); - il.Emit(OpCodes.Stloc, locAccum); - - // i += vectorCount - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Ldc_I4, vectorCount); - il.Emit(OpCodes.Add); - il.Emit(OpCodes.Stloc, locI); - - il.Emit(OpCodes.Br, lblSimdLoop); - il.MarkLabel(lblSimdLoopEnd); - - // === TAIL LOOP === - il.MarkLabel(lblTailLoop); - - // if (i >= totalSize) goto end - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Ldarg_S, (byte)4); // totalSize - il.Emit(OpCodes.Bge, lblTailLoopEnd); - - // Load input[i], convert to accumulator type - il.Emit(OpCodes.Ldarg_0); // input - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4, inputSize); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - EmitLoadIndirect(il, key.InputType); - EmitConvertTo(il, key.InputType, key.AccumulatorType); - - // Combine with accumulator - il.Emit(OpCodes.Ldloc, locAccum); - EmitReductionCombine(il, key.Op, key.AccumulatorType); - il.Emit(OpCodes.Stloc, locAccum); - - // i++ - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Ldc_I4_1); - il.Emit(OpCodes.Add); - il.Emit(OpCodes.Stloc, locI); - - il.Emit(OpCodes.Br, lblTailLoop); - il.MarkLabel(lblTailLoopEnd); - - // Return accumulator - il.Emit(OpCodes.Ldloc, locAccum); + NPTypeCode.Boolean => 1, + NPTypeCode.Byte => 1, + NPTypeCode.Int16 => 2, + NPTypeCode.UInt16 => 2, + NPTypeCode.Int32 => 4, + NPTypeCode.UInt32 => 4, + NPTypeCode.Int64 => 8, + NPTypeCode.UInt64 => 8, + NPTypeCode.Char => 2, + NPTypeCode.Single => 4, + NPTypeCode.Double => 8, + NPTypeCode.Decimal => 16, + _ => throw new NotSupportedException($"Type {type} not supported") + }; } /// - /// Emit a scalar reduction loop for contiguous arrays (no SIMD). + /// Get CLR Type for NPTypeCode. /// - private static void EmitReductionScalarLoop(ILGenerator il, ElementReductionKernelKey key, int inputSize) + internal static Type GetClrType(NPTypeCode type) { - // Args: void* input (0), int* strides (1), int* shape (2), int ndim (3), int totalSize (4) - - var locI = il.DeclareLocal(typeof(int)); // loop counter - var locAccum = il.DeclareLocal(GetClrType(key.AccumulatorType)); // accumulator - var locIdx = il.DeclareLocal(typeof(int)); // index for ArgMax/ArgMin - - var lblLoop = il.DefineLabel(); - var lblLoopEnd = il.DefineLabel(); - - // Initialize accumulator with identity value - EmitLoadIdentity(il, key.Op, key.AccumulatorType); - il.Emit(OpCodes.Stloc, locAccum); - - // For ArgMax/ArgMin, initialize index to 0 - if (key.Op == ReductionOp.ArgMax || key.Op == ReductionOp.ArgMin) - { - il.Emit(OpCodes.Ldc_I4_0); - il.Emit(OpCodes.Stloc, locIdx); - } - - // i = 0 - il.Emit(OpCodes.Ldc_I4_0); - il.Emit(OpCodes.Stloc, locI); - - il.MarkLabel(lblLoop); - - // if (i >= totalSize) goto end - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Ldarg_S, (byte)4); // totalSize - il.Emit(OpCodes.Bge, lblLoopEnd); - - // Load input[i], convert to accumulator type - il.Emit(OpCodes.Ldarg_0); // input - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4, inputSize); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - EmitLoadIndirect(il, key.InputType); - EmitConvertTo(il, key.InputType, key.AccumulatorType); - - // Combine with accumulator (and track index for ArgMax/ArgMin) - if (key.Op == ReductionOp.ArgMax || key.Op == ReductionOp.ArgMin) - { - EmitArgReductionStep(il, key.Op, key.AccumulatorType, locAccum, locIdx, locI); - } - else - { - il.Emit(OpCodes.Ldloc, locAccum); - EmitReductionCombine(il, key.Op, key.AccumulatorType); - il.Emit(OpCodes.Stloc, locAccum); - } - - // i++ - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Ldc_I4_1); - il.Emit(OpCodes.Add); - il.Emit(OpCodes.Stloc, locI); - - il.Emit(OpCodes.Br, lblLoop); - il.MarkLabel(lblLoopEnd); - - // Return accumulator or index - if (key.Op == ReductionOp.ArgMax || key.Op == ReductionOp.ArgMin) - { - il.Emit(OpCodes.Ldloc, locIdx); - } - else + return type switch { - il.Emit(OpCodes.Ldloc, locAccum); - } + NPTypeCode.Boolean => typeof(bool), + NPTypeCode.Byte => typeof(byte), + NPTypeCode.Int16 => typeof(short), + NPTypeCode.UInt16 => typeof(ushort), + NPTypeCode.Int32 => typeof(int), + NPTypeCode.UInt32 => typeof(uint), + NPTypeCode.Int64 => typeof(long), + NPTypeCode.UInt64 => typeof(ulong), + NPTypeCode.Char => typeof(char), + NPTypeCode.Single => typeof(float), + NPTypeCode.Double => typeof(double), + NPTypeCode.Decimal => typeof(decimal), + _ => throw new NotSupportedException($"Type {type} not supported") + }; } /// - /// Emit a strided reduction loop for non-contiguous arrays. + /// Check if type supports SIMD operations (V128/V256/V512). /// - private static void EmitReductionStridedLoop(ILGenerator il, ElementReductionKernelKey key, int inputSize) + internal static bool CanUseSimd(NPTypeCode type) { - // Args: void* input (0), int* strides (1), int* shape (2), int ndim (3), int totalSize (4) - - var locI = il.DeclareLocal(typeof(int)); // linear index - var locD = il.DeclareLocal(typeof(int)); // dimension counter - var locOffset = il.DeclareLocal(typeof(int)); // input offset - var locCoord = il.DeclareLocal(typeof(int)); // current coordinate - var locIdx = il.DeclareLocal(typeof(int)); // temp for coordinate calculation - var locAccum = il.DeclareLocal(GetClrType(key.AccumulatorType)); // accumulator - var locArgIdx = il.DeclareLocal(typeof(int)); // index for ArgMax/ArgMin - - var lblLoop = il.DefineLabel(); - var lblLoopEnd = il.DefineLabel(); - var lblDimLoop = il.DefineLabel(); - var lblDimLoopEnd = il.DefineLabel(); - - // Initialize accumulator - EmitLoadIdentity(il, key.Op, key.AccumulatorType); - il.Emit(OpCodes.Stloc, locAccum); - - // For ArgMax/ArgMin, initialize index to 0 - if (key.Op == ReductionOp.ArgMax || key.Op == ReductionOp.ArgMin) - { - il.Emit(OpCodes.Ldc_I4_0); - il.Emit(OpCodes.Stloc, locArgIdx); - } - - // i = 0 - il.Emit(OpCodes.Ldc_I4_0); - il.Emit(OpCodes.Stloc, locI); - - // Main loop - il.MarkLabel(lblLoop); - - // if (i >= totalSize) goto end - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Ldarg_S, (byte)4); // totalSize - il.Emit(OpCodes.Bge, lblLoopEnd); - - // Calculate offset from linear index - il.Emit(OpCodes.Ldc_I4_0); - il.Emit(OpCodes.Stloc, locOffset); - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Stloc, locIdx); - - // d = ndim - 1 - il.Emit(OpCodes.Ldarg_3); // ndim - il.Emit(OpCodes.Ldc_I4_1); - il.Emit(OpCodes.Sub); - il.Emit(OpCodes.Stloc, locD); - - il.MarkLabel(lblDimLoop); - - // if (d < 0) goto DimLoopEnd - il.Emit(OpCodes.Ldloc, locD); - il.Emit(OpCodes.Ldc_I4_0); - il.Emit(OpCodes.Blt, lblDimLoopEnd); - - // coord = idx % shape[d] - il.Emit(OpCodes.Ldloc, locIdx); - il.Emit(OpCodes.Ldarg_2); // shape - il.Emit(OpCodes.Ldloc, locD); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4_4); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - il.Emit(OpCodes.Ldind_I4); - il.Emit(OpCodes.Rem); - il.Emit(OpCodes.Stloc, locCoord); - - // idx /= shape[d] - il.Emit(OpCodes.Ldloc, locIdx); - il.Emit(OpCodes.Ldarg_2); // shape - il.Emit(OpCodes.Ldloc, locD); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4_4); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - il.Emit(OpCodes.Ldind_I4); - il.Emit(OpCodes.Div); - il.Emit(OpCodes.Stloc, locIdx); - - // offset += coord * strides[d] - il.Emit(OpCodes.Ldloc, locOffset); - il.Emit(OpCodes.Ldloc, locCoord); - il.Emit(OpCodes.Ldarg_1); // strides - il.Emit(OpCodes.Ldloc, locD); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4_4); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - il.Emit(OpCodes.Ldind_I4); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - il.Emit(OpCodes.Stloc, locOffset); - - // d-- - il.Emit(OpCodes.Ldloc, locD); - il.Emit(OpCodes.Ldc_I4_1); - il.Emit(OpCodes.Sub); - il.Emit(OpCodes.Stloc, locD); - - il.Emit(OpCodes.Br, lblDimLoop); - il.MarkLabel(lblDimLoopEnd); - - // Load input[offset] - il.Emit(OpCodes.Ldarg_0); // input - il.Emit(OpCodes.Ldloc, locOffset); - il.Emit(OpCodes.Conv_I); - il.Emit(OpCodes.Ldc_I4, inputSize); - il.Emit(OpCodes.Mul); - il.Emit(OpCodes.Add); - EmitLoadIndirect(il, key.InputType); - EmitConvertTo(il, key.InputType, key.AccumulatorType); - - // Combine with accumulator - if (key.Op == ReductionOp.ArgMax || key.Op == ReductionOp.ArgMin) - { - EmitArgReductionStep(il, key.Op, key.AccumulatorType, locAccum, locArgIdx, locI); - } - else - { - il.Emit(OpCodes.Ldloc, locAccum); - EmitReductionCombine(il, key.Op, key.AccumulatorType); - il.Emit(OpCodes.Stloc, locAccum); - } - - // i++ - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Ldc_I4_1); - il.Emit(OpCodes.Add); - il.Emit(OpCodes.Stloc, locI); - - il.Emit(OpCodes.Br, lblLoop); - il.MarkLabel(lblLoopEnd); + if (VectorBits == 0) return false; // No SIMD hardware - // Return accumulator or index - if (key.Op == ReductionOp.ArgMax || key.Op == ReductionOp.ArgMin) - { - il.Emit(OpCodes.Ldloc, locArgIdx); - } - else + return type switch { - il.Emit(OpCodes.Ldloc, locAccum); - } + NPTypeCode.Byte => true, + NPTypeCode.Int16 or NPTypeCode.UInt16 => true, + NPTypeCode.Int32 or NPTypeCode.UInt32 => true, + NPTypeCode.Int64 or NPTypeCode.UInt64 => true, + NPTypeCode.Single or NPTypeCode.Double => true, + _ => false // Boolean, Char, Decimal + }; } - #region Reduction IL Helpers - /// - /// Load the identity value for a reduction operation. + /// Get vector element count for type (adapts to V128/V256/V512). /// - private static void EmitLoadIdentity(ILGenerator il, ReductionOp op, NPTypeCode type) + internal static int GetVectorCount(NPTypeCode type) { - switch (op) - { - case ReductionOp.Sum: - case ReductionOp.Mean: - case ReductionOp.CumSum: - // Identity is 0 - EmitLoadZero(il, type); - break; - - case ReductionOp.Prod: - // Identity is 1 - EmitLoadOne(il, type); - break; - - case ReductionOp.Max: - // Identity is minimum value (so first element becomes max) - EmitLoadMinValue(il, type); - break; - - case ReductionOp.Min: - // Identity is maximum value (so first element becomes min) - EmitLoadMaxValue(il, type); - break; - - case ReductionOp.ArgMax: - case ReductionOp.ArgMin: - // For ArgMax/ArgMin, accumulator holds current best value - // Initialize with first element value (handled separately) - if (op == ReductionOp.ArgMax) - EmitLoadMinValue(il, type); - else - EmitLoadMaxValue(il, type); - break; - - default: - throw new NotSupportedException($"Identity for {op} not supported"); - } + if (VectorBits == 0) return 1; // Scalar fallback + return VectorBytes / GetTypeSize(type); } /// - /// Load zero for a type. + /// Emit load indirect for NPTypeCode. /// - private static void EmitLoadZero(ILGenerator il, NPTypeCode type) + internal static void EmitLoadIndirect(ILGenerator il, NPTypeCode type) { switch (type) { case NPTypeCode.Boolean: case NPTypeCode.Byte: + il.Emit(OpCodes.Ldind_U1); + break; case NPTypeCode.Int16: + il.Emit(OpCodes.Ldind_I2); + break; case NPTypeCode.UInt16: case NPTypeCode.Char: + il.Emit(OpCodes.Ldind_U2); + break; case NPTypeCode.Int32: + il.Emit(OpCodes.Ldind_I4); + break; case NPTypeCode.UInt32: - il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Ldind_U4); break; case NPTypeCode.Int64: case NPTypeCode.UInt64: - il.Emit(OpCodes.Ldc_I8, 0L); + il.Emit(OpCodes.Ldind_I8); break; case NPTypeCode.Single: - il.Emit(OpCodes.Ldc_R4, 0f); + il.Emit(OpCodes.Ldind_R4); break; case NPTypeCode.Double: - il.Emit(OpCodes.Ldc_R8, 0d); + il.Emit(OpCodes.Ldind_R8); break; case NPTypeCode.Decimal: - il.Emit(OpCodes.Ldsfld, typeof(decimal).GetField("Zero")!); + il.Emit(OpCodes.Ldobj, typeof(decimal)); break; default: - throw new NotSupportedException($"Type {type} not supported"); + throw new NotSupportedException($"Type {type} not supported for ldind"); } } /// - /// Load one for a type. + /// Emit store indirect for NPTypeCode. /// - private static void EmitLoadOne(ILGenerator il, NPTypeCode type) + internal static void EmitStoreIndirect(ILGenerator il, NPTypeCode type) { switch (type) { case NPTypeCode.Boolean: case NPTypeCode.Byte: + il.Emit(OpCodes.Stind_I1); + break; case NPTypeCode.Int16: case NPTypeCode.UInt16: case NPTypeCode.Char: + il.Emit(OpCodes.Stind_I2); + break; case NPTypeCode.Int32: case NPTypeCode.UInt32: - il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Stind_I4); break; case NPTypeCode.Int64: case NPTypeCode.UInt64: - il.Emit(OpCodes.Ldc_I8, 1L); + il.Emit(OpCodes.Stind_I8); break; case NPTypeCode.Single: - il.Emit(OpCodes.Ldc_R4, 1f); + il.Emit(OpCodes.Stind_R4); break; case NPTypeCode.Double: - il.Emit(OpCodes.Ldc_R8, 1d); + il.Emit(OpCodes.Stind_R8); break; case NPTypeCode.Decimal: - il.Emit(OpCodes.Ldsfld, typeof(decimal).GetField("One")!); + il.Emit(OpCodes.Stobj, typeof(decimal)); break; default: - throw new NotSupportedException($"Type {type} not supported"); + throw new NotSupportedException($"Type {type} not supported for stind"); } } /// - /// Load minimum value for a type. + /// Emit type conversion from source to target type. /// - private static void EmitLoadMinValue(ILGenerator il, NPTypeCode type) + internal static void EmitConvertTo(ILGenerator il, NPTypeCode from, NPTypeCode to) { - switch (type) - { - case NPTypeCode.Byte: - il.Emit(OpCodes.Ldc_I4, (int)byte.MinValue); - break; - case NPTypeCode.Int16: - il.Emit(OpCodes.Ldc_I4, (int)short.MinValue); - break; - case NPTypeCode.UInt16: - case NPTypeCode.Char: - il.Emit(OpCodes.Ldc_I4, (int)ushort.MinValue); - break; - case NPTypeCode.Int32: - il.Emit(OpCodes.Ldc_I4, int.MinValue); - break; - case NPTypeCode.UInt32: - il.Emit(OpCodes.Ldc_I4, unchecked((int)uint.MinValue)); - break; - case NPTypeCode.Int64: - il.Emit(OpCodes.Ldc_I8, long.MinValue); - break; - case NPTypeCode.UInt64: - il.Emit(OpCodes.Ldc_I8, unchecked((long)ulong.MinValue)); - break; - case NPTypeCode.Single: - il.Emit(OpCodes.Ldc_R4, float.NegativeInfinity); - break; - case NPTypeCode.Double: - il.Emit(OpCodes.Ldc_R8, double.NegativeInfinity); - break; - case NPTypeCode.Decimal: - il.Emit(OpCodes.Ldsfld, typeof(decimal).GetField("MinValue")!); - break; - default: - throw new NotSupportedException($"Type {type} not supported"); + if (from == to) + return; // No conversion needed + + // Special case: decimal conversions require method calls + if (from == NPTypeCode.Decimal || to == NPTypeCode.Decimal) + { + EmitDecimalConversion(il, from, to); + return; } - } - /// - /// Load maximum value for a type. - /// - private static void EmitLoadMaxValue(ILGenerator il, NPTypeCode type) - { - switch (type) + // For numeric types, use conv.* opcodes + switch (to) { + case NPTypeCode.Boolean: + // Convert to bool: != 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Cgt_Un); + break; case NPTypeCode.Byte: - il.Emit(OpCodes.Ldc_I4, (int)byte.MaxValue); + il.Emit(OpCodes.Conv_U1); break; case NPTypeCode.Int16: - il.Emit(OpCodes.Ldc_I4, (int)short.MaxValue); + il.Emit(OpCodes.Conv_I2); break; case NPTypeCode.UInt16: case NPTypeCode.Char: - il.Emit(OpCodes.Ldc_I4, (int)ushort.MaxValue); + il.Emit(OpCodes.Conv_U2); break; case NPTypeCode.Int32: - il.Emit(OpCodes.Ldc_I4, int.MaxValue); + il.Emit(OpCodes.Conv_I4); break; case NPTypeCode.UInt32: - il.Emit(OpCodes.Ldc_I4, unchecked((int)uint.MaxValue)); + il.Emit(OpCodes.Conv_U4); break; case NPTypeCode.Int64: - il.Emit(OpCodes.Ldc_I8, long.MaxValue); + if (IsUnsigned(from)) + il.Emit(OpCodes.Conv_U8); + else + il.Emit(OpCodes.Conv_I8); break; case NPTypeCode.UInt64: - il.Emit(OpCodes.Ldc_I8, unchecked((long)ulong.MaxValue)); + il.Emit(OpCodes.Conv_U8); break; case NPTypeCode.Single: - il.Emit(OpCodes.Ldc_R4, float.PositiveInfinity); + if (IsUnsigned(from)) + il.Emit(OpCodes.Conv_R_Un); + il.Emit(OpCodes.Conv_R4); break; case NPTypeCode.Double: - il.Emit(OpCodes.Ldc_R8, double.PositiveInfinity); - break; - case NPTypeCode.Decimal: - il.Emit(OpCodes.Ldsfld, typeof(decimal).GetField("MaxValue")!); + if (IsUnsigned(from)) + il.Emit(OpCodes.Conv_R_Un); + il.Emit(OpCodes.Conv_R8); break; default: - throw new NotSupportedException($"Type {type} not supported"); + throw new NotSupportedException($"Conversion to {to} not supported"); } } /// - /// Emit horizontal reduction of a Vector256. - /// Stack has Vector256, result is scalar reduction. + /// Emit decimal-specific conversions. /// - private static void EmitVectorHorizontalReduction(ILGenerator il, ReductionOp op, NPTypeCode type) + private static void EmitDecimalConversion(ILGenerator il, NPTypeCode from, NPTypeCode to) { - var clrType = GetClrType(type); - var vectorType = typeof(Vector256<>).MakeGenericType(clrType); - - switch (op) + if (to == NPTypeCode.Decimal) { - case ReductionOp.Sum: - // Use Vector256.Sum() - var sumMethod = typeof(Vector256).GetMethods(BindingFlags.Public | BindingFlags.Static) - .Where(m => m.Name == "Sum" && m.IsGenericMethod && m.GetParameters().Length == 1) - .Select(m => m.MakeGenericMethod(clrType)) - .FirstOrDefault(m => m.GetParameters()[0].ParameterType == vectorType); - - if (sumMethod != null) - { - il.EmitCall(OpCodes.Call, sumMethod, null); - } - else - { - // Fallback: manual horizontal add using GetElement - EmitManualHorizontalSum(il, type); - } - break; + // Convert to decimal - need to handle bool/char first + if (from == NPTypeCode.Boolean) + { + // bool -> int -> decimal + il.Emit(OpCodes.Conv_I4); + il.EmitCall(OpCodes.Call, typeof(decimal).GetMethod("op_Implicit", new[] { typeof(int) })!, null); + return; + } + if (from == NPTypeCode.Char) + { + // char -> int -> decimal + il.Emit(OpCodes.Conv_I4); + il.EmitCall(OpCodes.Call, typeof(decimal).GetMethod("op_Implicit", new[] { typeof(int) })!, null); + return; + } - case ReductionOp.Max: - case ReductionOp.Min: - // No built-in horizontal max/min, need to reduce manually - EmitManualHorizontalMinMax(il, op, type); - break; + var method = from switch + { + NPTypeCode.Byte => typeof(decimal).GetMethod("op_Implicit", new[] { typeof(byte) }), + NPTypeCode.Int16 => typeof(decimal).GetMethod("op_Implicit", new[] { typeof(short) }), + NPTypeCode.UInt16 => typeof(decimal).GetMethod("op_Implicit", new[] { typeof(ushort) }), + NPTypeCode.Int32 => typeof(decimal).GetMethod("op_Implicit", new[] { typeof(int) }), + NPTypeCode.UInt32 => typeof(decimal).GetMethod("op_Implicit", new[] { typeof(uint) }), + NPTypeCode.Int64 => typeof(decimal).GetMethod("op_Implicit", new[] { typeof(long) }), + NPTypeCode.UInt64 => typeof(decimal).GetMethod("op_Implicit", new[] { typeof(ulong) }), + NPTypeCode.Single => typeof(decimal).GetMethod("op_Explicit", new[] { typeof(float) }), + NPTypeCode.Double => typeof(decimal).GetMethod("op_Explicit", new[] { typeof(double) }), + _ => throw new NotSupportedException($"Cannot convert {from} to decimal") + }; + il.EmitCall(OpCodes.Call, method!, null); + } + else + { + // Convert from decimal - need to handle bool/char + if (to == NPTypeCode.Boolean) + { + // decimal -> int -> bool (compare with 0) + il.EmitCall(OpCodes.Call, typeof(decimal).GetMethod("ToInt32", new[] { typeof(decimal) })!, null); + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Cgt_Un); + return; + } + if (to == NPTypeCode.Char) + { + // decimal -> int -> char + il.EmitCall(OpCodes.Call, typeof(decimal).GetMethod("ToInt32", new[] { typeof(decimal) })!, null); + il.Emit(OpCodes.Conv_U2); + return; + } - default: - throw new NotSupportedException($"SIMD horizontal reduction for {op} not supported"); + var method = to switch + { + NPTypeCode.Byte => typeof(decimal).GetMethod("ToByte", new[] { typeof(decimal) }), + NPTypeCode.Int16 => typeof(decimal).GetMethod("ToInt16", new[] { typeof(decimal) }), + NPTypeCode.UInt16 => typeof(decimal).GetMethod("ToUInt16", new[] { typeof(decimal) }), + NPTypeCode.Int32 => typeof(decimal).GetMethod("ToInt32", new[] { typeof(decimal) }), + NPTypeCode.UInt32 => typeof(decimal).GetMethod("ToUInt32", new[] { typeof(decimal) }), + NPTypeCode.Int64 => typeof(decimal).GetMethod("ToInt64", new[] { typeof(decimal) }), + NPTypeCode.UInt64 => typeof(decimal).GetMethod("ToUInt64", new[] { typeof(decimal) }), + NPTypeCode.Single => typeof(decimal).GetMethod("ToSingle", new[] { typeof(decimal) }), + NPTypeCode.Double => typeof(decimal).GetMethod("ToDouble", new[] { typeof(decimal) }), + _ => throw new NotSupportedException($"Cannot convert decimal to {to}") + }; + il.EmitCall(OpCodes.Call, method!, null); } } /// - /// Emit manual horizontal sum using GetElement. + /// Check if type is unsigned. /// - private static void EmitManualHorizontalSum(ILGenerator il, NPTypeCode type) + internal static bool IsUnsigned(NPTypeCode type) { - var clrType = GetClrType(type); - var vectorType = typeof(Vector256<>).MakeGenericType(clrType); - int count = GetVectorCount(type); - - // Store vector in local - var locVec = il.DeclareLocal(vectorType); - il.Emit(OpCodes.Stloc, locVec); - - // Load first element - il.Emit(OpCodes.Ldloc, locVec); - il.Emit(OpCodes.Ldc_I4_0); - var getElementMethod = typeof(Vector256).GetMethods(BindingFlags.Public | BindingFlags.Static) - .Where(m => m.Name == "GetElement" && m.IsGenericMethod) - .Select(m => m.MakeGenericMethod(clrType)) - .First(); - il.EmitCall(OpCodes.Call, getElementMethod, null); - - // Add remaining elements - for (int i = 1; i < count; i++) - { - il.Emit(OpCodes.Ldloc, locVec); - il.Emit(OpCodes.Ldc_I4, i); - il.EmitCall(OpCodes.Call, getElementMethod, null); - il.Emit(OpCodes.Add); - } + return type == NPTypeCode.Byte || type == NPTypeCode.UInt16 || + type == NPTypeCode.UInt32 || type == NPTypeCode.UInt64 || + type == NPTypeCode.Char; } /// - /// Emit manual horizontal min/max using GetElement. + /// Emit scalar operation for NPTypeCode. /// - private static void EmitManualHorizontalMinMax(ILGenerator il, ReductionOp op, NPTypeCode type) + internal static void EmitScalarOperation(ILGenerator il, BinaryOp op, NPTypeCode resultType) { - var clrType = GetClrType(type); - var vectorType = typeof(Vector256<>).MakeGenericType(clrType); - int count = GetVectorCount(type); - - // Store vector in local - var locVec = il.DeclareLocal(vectorType); - il.Emit(OpCodes.Stloc, locVec); - - // Load first element as initial accumulator - il.Emit(OpCodes.Ldloc, locVec); - il.Emit(OpCodes.Ldc_I4_0); - var getElementMethod = typeof(Vector256).GetMethods(BindingFlags.Public | BindingFlags.Static) - .Where(m => m.Name == "GetElement" && m.IsGenericMethod) - .Select(m => m.MakeGenericMethod(clrType)) - .First(); - il.EmitCall(OpCodes.Call, getElementMethod, null); + // Special handling for decimal (uses operator methods) + if (resultType == NPTypeCode.Decimal) + { + EmitDecimalOperation(il, op); + return; + } - // Compare with remaining elements using Math.Max/Math.Min - var mathMethod = GetMathMinMaxMethod(op, clrType); + // Special handling for boolean + if (resultType == NPTypeCode.Boolean) + { + // For bool, only meaningful ops are probably logical, but we'll support arithmetic + // Treat as byte arithmetic + } - for (int i = 1; i < count; i++) + var opcode = op switch { - il.Emit(OpCodes.Ldloc, locVec); - il.Emit(OpCodes.Ldc_I4, i); - il.EmitCall(OpCodes.Call, getElementMethod, null); + BinaryOp.Add => OpCodes.Add, + BinaryOp.Subtract => OpCodes.Sub, + BinaryOp.Multiply => OpCodes.Mul, + BinaryOp.Divide => IsUnsigned(resultType) ? OpCodes.Div_Un : OpCodes.Div, + BinaryOp.Mod => IsUnsigned(resultType) ? OpCodes.Rem_Un : OpCodes.Rem, + BinaryOp.BitwiseAnd => OpCodes.And, + BinaryOp.BitwiseOr => OpCodes.Or, + BinaryOp.BitwiseXor => OpCodes.Xor, + _ => throw new NotSupportedException($"Operation {op} not supported") + }; - if (mathMethod != null) - { - il.EmitCall(OpCodes.Call, mathMethod, null); - } - else - { - // Fallback for types without Math.Max/Min (use comparison) - EmitScalarMinMax(il, op, type); - } - } + il.Emit(opcode); } /// - /// Get the Math.Max or Math.Min method for a type. + /// Emit decimal-specific operation using operator methods. /// - private static MethodInfo? GetMathMinMaxMethod(ReductionOp op, Type clrType) + private static void EmitDecimalOperation(ILGenerator il, BinaryOp op) { - string name = op == ReductionOp.Max ? "Max" : "Min"; - return typeof(Math).GetMethod(name, new[] { clrType, clrType }); + // Bitwise operations not supported for decimal + if (op == BinaryOp.BitwiseAnd || op == BinaryOp.BitwiseOr || op == BinaryOp.BitwiseXor) + throw new NotSupportedException($"Bitwise operation {op} not supported for decimal type"); + + var methodName = op switch + { + BinaryOp.Add => "op_Addition", + BinaryOp.Subtract => "op_Subtraction", + BinaryOp.Multiply => "op_Multiply", + BinaryOp.Divide => "op_Division", + BinaryOp.Mod => "op_Modulus", + _ => throw new NotSupportedException($"Operation {op} not supported for decimal") + }; + + var method = typeof(decimal).GetMethod( + methodName, + BindingFlags.Public | BindingFlags.Static, + null, + new[] { typeof(decimal), typeof(decimal) }, + null + ); + + il.EmitCall(OpCodes.Call, method!, null); } /// - /// Emit scalar min/max comparison. - /// Stack has [value1, value2], result is min or max. + /// Emit Vector.Load for NPTypeCode (adapts to V128/V256/V512). /// - private static void EmitScalarMinMax(ILGenerator il, ReductionOp op, NPTypeCode type) + internal static void EmitVectorLoad(ILGenerator il, NPTypeCode type) { - // Use comparison: (a > b) ? a : b for Max, (a < b) ? a : b for Min - var locA = il.DeclareLocal(GetClrType(type)); - var locB = il.DeclareLocal(GetClrType(type)); - var lblFalse = il.DefineLabel(); - var lblEnd = il.DefineLabel(); - - il.Emit(OpCodes.Stloc, locB); - il.Emit(OpCodes.Stloc, locA); - - il.Emit(OpCodes.Ldloc, locA); - il.Emit(OpCodes.Ldloc, locB); - - if (op == ReductionOp.Max) - { - if (IsUnsigned(type)) - il.Emit(OpCodes.Bgt_Un, lblFalse); - else - il.Emit(OpCodes.Bgt, lblFalse); + var containerType = GetVectorContainerType(); + var clrType = GetClrType(type); - // a <= b, return b - il.Emit(OpCodes.Ldloc, locB); - il.Emit(OpCodes.Br, lblEnd); + var loadMethod = containerType + .GetMethods(BindingFlags.Public | BindingFlags.Static) + .First(m => m.Name == "Load" && m.IsGenericMethod && + m.GetParameters().Length == 1 && + m.GetParameters()[0].ParameterType.IsPointer) + .MakeGenericMethod(clrType); - il.MarkLabel(lblFalse); - // a > b, return a - il.Emit(OpCodes.Ldloc, locA); - } - else - { - if (IsUnsigned(type)) - il.Emit(OpCodes.Blt_Un, lblFalse); - else - il.Emit(OpCodes.Blt, lblFalse); + il.EmitCall(OpCodes.Call, loadMethod, null); + } - // a >= b, return b - il.Emit(OpCodes.Ldloc, locB); - il.Emit(OpCodes.Br, lblEnd); + /// + /// Emit Vector.Create for NPTypeCode (broadcasts scalar to all vector elements). + /// Stack must have scalar value on top; result is Vector on stack. + /// + internal static void EmitVectorCreate(ILGenerator il, NPTypeCode type) + { + var containerType = GetVectorContainerType(); + var clrType = GetClrType(type); - il.MarkLabel(lblFalse); - // a < b, return a - il.Emit(OpCodes.Ldloc, locA); - } + var createMethod = containerType + .GetMethods(BindingFlags.Public | BindingFlags.Static) + .First(m => m.Name == "Create" && m.IsGenericMethod && + m.GetParameters().Length == 1 && + !m.GetParameters()[0].ParameterType.IsPointer) + .MakeGenericMethod(clrType); - il.MarkLabel(lblEnd); + il.EmitCall(OpCodes.Call, createMethod, null); } /// - /// Emit reduction combine operation. - /// Stack has [newValue, accumulator], result is combined value. + /// Emit Vector.Store for NPTypeCode (adapts to V128/V256/V512). /// - private static void EmitReductionCombine(ILGenerator il, ReductionOp op, NPTypeCode type) + internal static void EmitVectorStore(ILGenerator il, NPTypeCode type) { - switch (op) - { - case ReductionOp.Sum: - case ReductionOp.Mean: - case ReductionOp.CumSum: - // Add - if (type == NPTypeCode.Decimal) - { - il.EmitCall(OpCodes.Call, typeof(decimal).GetMethod("op_Addition", new[] { typeof(decimal), typeof(decimal) })!, null); - } - else - { - il.Emit(OpCodes.Add); - } - break; - - case ReductionOp.Prod: - // Multiply - if (type == NPTypeCode.Decimal) - { - il.EmitCall(OpCodes.Call, typeof(decimal).GetMethod("op_Multiply", new[] { typeof(decimal), typeof(decimal) })!, null); - } - else - { - il.Emit(OpCodes.Mul); - } - break; - - case ReductionOp.Max: - { - var clrType = GetClrType(type); - var mathMethod = GetMathMinMaxMethod(op, clrType); - if (mathMethod != null) - { - il.EmitCall(OpCodes.Call, mathMethod, null); - } - else - { - EmitScalarMinMax(il, op, type); - } - } - break; + var containerType = GetVectorContainerType(); + var clrType = GetClrType(type); - case ReductionOp.Min: - { - var clrType = GetClrType(type); - var mathMethod = GetMathMinMaxMethod(op, clrType); - if (mathMethod != null) - { - il.EmitCall(OpCodes.Call, mathMethod, null); - } - else - { - EmitScalarMinMax(il, op, type); - } - } - break; + var storeMethod = containerType + .GetMethods(BindingFlags.Public | BindingFlags.Static) + .First(m => m.Name == "Store" && m.IsGenericMethod && + m.GetParameters().Length == 2 && + m.GetParameters()[0].ParameterType.IsGenericType) + .MakeGenericMethod(clrType); - default: - throw new NotSupportedException($"Reduction combine for {op} not supported"); - } + il.EmitCall(OpCodes.Call, storeMethod, null); } /// - /// Emit ArgMax/ArgMin step - compare new value with accumulator, update index if better. - /// Stack has [newValue]. Updates locAccum and locIdx. + /// Emit Vector operation for NPTypeCode (adapts to V128/V256/V512). /// - private static void EmitArgReductionStep(ILGenerator il, ReductionOp op, NPTypeCode type, - LocalBuilder locAccum, LocalBuilder locIdx, LocalBuilder locI) + internal static void EmitVectorOperation(ILGenerator il, BinaryOp op, NPTypeCode type) { - // newValue is on stack, compare with locAccum - var lblSkip = il.DefineLabel(); - - il.Emit(OpCodes.Dup); // [newValue, newValue] - il.Emit(OpCodes.Ldloc, locAccum); // [newValue, newValue, accum] + var clrType = GetClrType(type); + var vectorType = GetVectorType(clrType); - // Compare: newValue > accum (for ArgMax) or newValue < accum (for ArgMin) - if (op == ReductionOp.ArgMax) - { - if (IsUnsigned(type)) - il.Emit(OpCodes.Ble_Un, lblSkip); - else - il.Emit(OpCodes.Ble, lblSkip); - } - else // ArgMin + string methodName = op switch { - if (IsUnsigned(type)) - il.Emit(OpCodes.Bge_Un, lblSkip); - else - il.Emit(OpCodes.Bge, lblSkip); - } - - // Update: newValue is better - // Stack has [newValue] - il.Emit(OpCodes.Stloc, locAccum); // accum = newValue - il.Emit(OpCodes.Ldloc, locI); - il.Emit(OpCodes.Stloc, locIdx); // idx = i - var lblEnd = il.DefineLabel(); - il.Emit(OpCodes.Br, lblEnd); + BinaryOp.Add => "op_Addition", + BinaryOp.Subtract => "op_Subtraction", + BinaryOp.Multiply => "op_Multiply", + BinaryOp.Divide => "op_Division", + _ => throw new NotSupportedException($"Operation {op} not supported for SIMD") + }; - il.MarkLabel(lblSkip); - // Not better, pop newValue - il.Emit(OpCodes.Pop); + var opMethod = vectorType.GetMethod(methodName, + BindingFlags.Public | BindingFlags.Static, + null, new[] { vectorType, vectorType }, null); - il.MarkLabel(lblEnd); + il.EmitCall(OpCodes.Call, opMethod!, null); } #endregion - - #endregion } } From d74364026bc9ce0150c3363e4c59a0c530738657 Mon Sep 17 00:00:00 2001 From: Eli Belash Date: Sat, 21 Feb 2026 16:46:59 +0200 Subject: [PATCH 14/15] refactor: rename AllocationType.AllocHGlobal to Native The enum value name was misleading after migrating from Marshal.AllocHGlobal to NativeMemory.Alloc. Co-Authored-By: Claude Opus 4.6 --- .../Backends/Unmanaged/UnmanagedMemoryBlock`1.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/NumSharp.Core/Backends/Unmanaged/UnmanagedMemoryBlock`1.cs b/src/NumSharp.Core/Backends/Unmanaged/UnmanagedMemoryBlock`1.cs index 833400dc..5ddd0d77 100644 --- a/src/NumSharp.Core/Backends/Unmanaged/UnmanagedMemoryBlock`1.cs +++ b/src/NumSharp.Core/Backends/Unmanaged/UnmanagedMemoryBlock`1.cs @@ -929,7 +929,7 @@ private class Disposer : IDisposable private enum AllocationType { - AllocHGlobal, + Native, GCHandle, External, Wrap @@ -944,13 +944,13 @@ private enum AllocationType /// - /// Construct a AllocationType.AllocHGlobal + /// Construct a AllocationType.Native (NativeMemory.Alloc) /// /// public Disposer(IntPtr address) { Address = address; - _type = AllocationType.AllocHGlobal; + _type = AllocationType.Native; } /// @@ -991,7 +991,7 @@ private void ReleaseUnmanagedResources() switch (_type) { - case AllocationType.AllocHGlobal: + case AllocationType.Native: NativeMemory.Free((void*)Address); return; case AllocationType.Wrap: From 4aa4176ac0bda29b6323509ade17734cdbbb0aa4 Mon Sep 17 00:00:00 2001 From: Eli Belash Date: Sat, 21 Feb 2026 17:35:21 +0200 Subject: [PATCH 15/15] docs: fix misleading ALIGNED flag comment The comment incorrectly stated ALIGNED is true because of "managed memory". The actual reason is that NumSharp uses Vector.Load (unaligned) rather than Vector.LoadAligned, so alignment tracking is unnecessary. Closes #581 Co-Authored-By: Claude Opus 4.6 --- src/NumSharp.Core/View/Shape.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NumSharp.Core/View/Shape.cs b/src/NumSharp.Core/View/Shape.cs index ee7d2512..4599480b 100644 --- a/src/NumSharp.Core/View/Shape.cs +++ b/src/NumSharp.Core/View/Shape.cs @@ -94,7 +94,7 @@ private static int ComputeFlagsStatic(int[] dims, int[] strides) if (!isBroadcasted && ComputeIsContiguousStatic(dims, strides)) flags |= (int)ArrayFlags.C_CONTIGUOUS; - // ALIGNED is always true for managed memory + // ALIGNED is always true because NumSharp uses unaligned SIMD loads (Vector.Load, not LoadAligned) flags |= (int)ArrayFlags.ALIGNED; // WRITEABLE is true unless this is a broadcast shape (NumPy behavior).